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

    Статус
    Оффлайн
    Регистрация
    19.05.2021
    Сообщений
    24
    Репутация:
    2 ±

    Как игроку выдается id (playerid)?

    Всем привет.
    На сервере есть 1000 слотов, при заходе игрок получает наименьший свободный id, насколько я знаю.
    Мне нужно реализовать похожую систему.
    Представим, что у меня массив из 1000 ячеек и мне нужно в определенный момент найти ячейку с наименьшим индексом и вернуть этот индекс как id. Допустим, у меня тоже игроки заходят и я сначала последовательно выделяю в массиве: 0-ю ячейку, потом 1-ю, потом 2-ю, но, потом 0-я ячейка освобождается и при следующем вызове моей функции должен вернуться именно 0. А потом последовательность продолжается как обычно 3, 4, 5 и т. д. Короче говоря, нужно повторить то, что делает САМП при заходе/выходе игрока. Только у меня вместо игроков свои "объекты". Надеюсь, понятно объяснил.
    В моей задаче массив из 16000 элементов минимум. Поэтому не хочу циклом проходить от начал до конца и проверять каждую ячейку свободна она или нет. Может, есть какой-то алгоритм?
    UPD: вспомнил про итераторы. Я с ними не работал, но может можно их как-то использовать?
    Последний раз редактировалось Scander; 04.06.2021 в 18:38.

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

    Статус
    Оффлайн
    Регистрация
    24.01.2014
    Сообщений
    27
    Репутация:
    10 ±
    Сколько ячеек может освободиться? Одна или более?
    Правильное описание проделанной работы.
      Открыть/закрыть
    Доброго времени суток! Вот что было проделано:
    01. Система красивого интро при коннекте на сервер
    02. Система регистрации аккаунта
    03. Система автошколы
    04. Система личных сообщений
    05. Система бизнесов
    06. Система складов
    07. Система магазин 24/7
    08. Система домов
    09. Система админки 10уровней
    10. Система PayDay
    11. Система сообщений
    12. Система гонок
    13. Система фракций
    14. Система Складов
    15. Система телефона
    16. Система рюкзака
    17. Система пау
    18. Система пиу
    19. Система бах-бах
    20. Система бдыщ

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

    Статус
    Оффлайн
    Регистрация
    19.05.2021
    Сообщений
    24
    Репутация:
    2 ±
    Цитата Сообщение от LINKINPARK Посмотреть сообщение
    Сколько ячеек может освободиться? Одна или более?
    Хоть сколько. Вот как с сервера может сразу несколько игроков отсоединиться (следовательно, несколько айдишников освободятся) так и у меня.

    - - - Добавлено - - -

    Вот еще пример:
    создаю дома на сервере прямо в игре, массив заполняется: 0, 1, 2, 3, 4, 5, 6 ячейки занимаются... но потом я решаю удалить 1-й и 3-й дом. Теперь 1-я и 3-я ячейки в массиве свободны и следующие созданные дома должны занять 1-ю и 3-ю ячейки последовательно. А потом продолжаем занимать ячейки 7, 8, 9 и т. д.
    Последний раз редактировалось Scander; 04.06.2021 в 18:49.

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

    Статус
    Оффлайн
    Регистрация
    24.01.2014
    Сообщений
    27
    Репутация:
    10 ±
    Цитата Сообщение от Scander Посмотреть сообщение
    Хоть сколько. Вот как с сервера может сразу несколько игроков отсоединиться (следовательно, несколько айдишников освободятся) так и у меня.

    - - - Добавлено - - -

    Вот еще пример:
    создаю дома на сервере прямо в игре, массив заполняется: 0, 1, 2, 3, 4, 5, 6 ячейки занимаются... но потом я решаю удалить 1-й и 3-й дом. Теперь 1-я и 3-я ячейки в массиве свободны и следующие созданные дома должны занять 1-ю и 3-ю ячейки последовательно. А потом продолжаем занимать ячейки 7, 8, 9 и т. д.
    Ну лично я для этого (пример с домами) всегда использовал цикл. Я понял чего ты хочешь добиться. цикл на 16тыс итераций это затратно, можно использовать базу данных, SQLite например, выборкой можно быстро найти свободную ячейку, но опять же все зависит от того как часто нужен поиск освободившихся ячеек, при очень частом обновлении это может быть более затратно чем цикл.
    Второй вариант хранить освободившиеся ячейки в отдельном массиве поменьше, 100 штук например, при этом держа в памяти последний максимальный ид ячейки, для того чтобы правильно продолжить заполнять массив если пустые ячейки закончатся
    Последний раз редактировалось LINKINPARK; 04.06.2021 в 19:07.
    Правильное описание проделанной работы.
      Открыть/закрыть
    Доброго времени суток! Вот что было проделано:
    01. Система красивого интро при коннекте на сервер
    02. Система регистрации аккаунта
    03. Система автошколы
    04. Система личных сообщений
    05. Система бизнесов
    06. Система складов
    07. Система магазин 24/7
    08. Система домов
    09. Система админки 10уровней
    10. Система PayDay
    11. Система сообщений
    12. Система гонок
    13. Система фракций
    14. Система Складов
    15. Система телефона
    16. Система рюкзака
    17. Система пау
    18. Система пиу
    19. Система бах-бах
    20. Система бдыщ

  5. Пользователь сказал cпасибо:
    Scander (04.06.2021)
  6. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Как-то так:
    1. #define MAX_CELLS 1000
    2. new minfreeid=0;
    3.  
    4. IsCellFree(id) return /* ... */;
    5.  
    6. FreeCell(id)
    7. {
    8. /* ... */
    9. if (id < minfreeid)
    10. minfreeid = id;
    11. }
    12.  
    13. AllocateCell()
    14. {
    15. new id = minfreeid;
    16. if (id >= MAX_CELLS)
    17. return -1;
    18. do {} while (++minfreeid < MAX_CELLS && IsCellFree(minfreeid) == false);
    19. /* ... */
    20. return id;
    21. }
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. Пользователь сказал cпасибо:
    Scander (04.06.2021)
  8. #6
    Аватар для LINKINPARK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.01.2014
    Сообщений
    27
    Репутация:
    10 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Как-то так:
    1. #define MAX_CELLS 1000
    2. new minfreeid=0;
    3.  
    4. IsCellFree(id) return /* ... */;
    5.  
    6. FreeCell(id)
    7. {
    8. /* ... */
    9. if (id < minfreeid)
    10. minfreeid = id;
    11. }
    12.  
    13. AllocateCell()
    14. {
    15. new id = minfreeid;
    16. if (id >= MAX_CELLS)
    17. return -1;
    18. do {} while (++minfreeid < MAX_CELLS && IsCellFree(minfreeid) == false);
    19. /* ... */
    20. return id;
    21. }
    Если освободить 3 ячейку и следом 4 и после обратиться к AllocateCell то 3 ячейка не будет учтена, хотя будет являться пустой
    Последний раз редактировалось LINKINPARK; 04.06.2021 в 19:28.
    Правильное описание проделанной работы.
      Открыть/закрыть
    Доброго времени суток! Вот что было проделано:
    01. Система красивого интро при коннекте на сервер
    02. Система регистрации аккаунта
    03. Система автошколы
    04. Система личных сообщений
    05. Система бизнесов
    06. Система складов
    07. Система магазин 24/7
    08. Система домов
    09. Система админки 10уровней
    10. Система PayDay
    11. Система сообщений
    12. Система гонок
    13. Система фракций
    14. Система Складов
    15. Система телефона
    16. Система рюкзака
    17. Система пау
    18. Система пиу
    19. Система бах-бах
    20. Система бдыщ

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

    Статус
    Оффлайн
    Регистрация
    19.05.2021
    Сообщений
    24
    Репутация:
    2 ±
    Цитата Сообщение от LINKINPARK Посмотреть сообщение
    Если освободить 3 ячейку и следом 4 и после обратиться к AllocateCell то 3 ячейка не будет учтена, хотя будет являться пустой
    Мне кажется, код рабочий.
    minfreeid будет оставаться 3, даже после освобождения 4-й ячейки, т. к. стоит проверка, что if (id < minfreeid), то перезаписываем minfreeid на id. А 4 не меньше minfreeid (3).

    - - - Добавлено - - -

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Как-то так:
    1. #define MAX_CELLS 1000
    2. new minfreeid=0;
    3.  
    4. IsCellFree(id) return /* ... */;
    5.  
    6. FreeCell(id)
    7. {
    8. /* ... */
    9. if (id < minfreeid)
    10. minfreeid = id;
    11. }
    12.  
    13. AllocateCell()
    14. {
    15. new id = minfreeid;
    16. if (id >= MAX_CELLS)
    17. return -1;
    18. do {} while (++minfreeid < MAX_CELLS && IsCellFree(minfreeid) == false);
    19. /* ... */
    20. return id;
    21. }
    Итерироваться приходится, но хотя бы не через весь массив.
    Думаю, возьму себе этот вариант пока.
    Спасибо большое)

    - - - Добавлено - - -

    Цитата Сообщение от LINKINPARK Посмотреть сообщение
    Ну лично я для этого (пример с домами) всегда использовал цикл. Я понял чего ты хочешь добиться. цикл на 16тыс итераций это затратно, можно использовать базу данных, SQLite например, выборкой можно быстро найти свободную ячейку, но опять же все зависит от того как часто нужен поиск освободившихся ячеек, при очень частом обновлении это может быть более затратно чем цикл.
    Второй вариант хранить освободившиеся ячейки в отдельном массиве поменьше, 100 штук например, при этом держа в памяти последний максимальный ид ячейки, для того чтобы правильно продолжить заполнять массив если пустые ячейки закончатся
    Тебе тоже спасибо за помощь. Второй вариант тоже нормальный, мне его уже предлагали в другом месте. Но пока не буду создавать дополнительные массивы.
    Последний раз редактировалось Scander; 04.06.2021 в 20:04.

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

    Статус
    Оффлайн
    Регистрация
    24.01.2014
    Сообщений
    27
    Репутация:
    10 ±
    Цитата Сообщение от Scander Посмотреть сообщение
    Мне кажется, код рабочий.
    minfreeid будет оставаться 3, даже после освобождения 4-й ячейки, т. к. стоит проверка, что if (id < minfreeid), то перезаписываем minfreeid на id. А 4 не меньше minfreeid (3).
    Я затупил, извиняюсь
    Последний раз редактировалось LINKINPARK; 04.06.2021 в 20:19.
    Правильное описание проделанной работы.
      Открыть/закрыть
    Доброго времени суток! Вот что было проделано:
    01. Система красивого интро при коннекте на сервер
    02. Система регистрации аккаунта
    03. Система автошколы
    04. Система личных сообщений
    05. Система бизнесов
    06. Система складов
    07. Система магазин 24/7
    08. Система домов
    09. Система админки 10уровней
    10. Система PayDay
    11. Система сообщений
    12. Система гонок
    13. Система фракций
    14. Система Складов
    15. Система телефона
    16. Система рюкзака
    17. Система пау
    18. Система пиу
    19. Система бах-бах
    20. Система бдыщ

 

 

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

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

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

Ваши права

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