Jump to content
  • Sign in to follow this  

    Если загрузить слот на двух серверах можно на одном продавать, на другом сохранять и снова продавать


    Electr0
    • Публичное тестирование

    Текст от кларуса который показал баг:

    Цитата

    я зашел на приватную мегу
    загрузил убегу с оружием
    вышел с приватной меги (убега осталась)
    зашел на обычную мегу
    загрузил эту же убегу
    продал с неё пулемёт (+5000)
    вернулся на приватную мегу
    и увидел что моя убега стоит заспавненная вместе с пулемётом который я продал только что на обычной меге
    ну я просто сохранил её (вместе с пулемётом потому что он заспавнен)
    вернулся на обычную мегу и опять его продал (ред.)

     

    Sign in to follow this  


    User Feedback

    Recommended Comments

    в связи с этим приватная мега и обычная вторая отключены до момента выработки фикса, скорее всего на месяц полтора т.к. времени у меня не будет после 27 января вообще.

    Share this comment


    Link to comment
    Share on other sites

    функция подгрузки с карты отцовства предметов сыграла злую шутку (ведь спасались так те кто случайно вылетел с сервера), возможно нужно будет внедрять идентификатор сохраненному слоту, если он не сходится с тем что в базе данных значит это скажем так не валидный слот и сохранять его нельзя.

    Share this comment


    Link to comment
    Share on other sites

    примерный вариант фикса: 

    в базе данных слотов добавляем поле version оно будет зашиваться при сохранении слота прибавляя +1 при каждом сохранении. далее во время сохранения во время прошивки слота предметам заодно прошиваем и номер version , при входе на сервер во время сборки данных о названиях слотов и количества предметов в них заодно записываем значение version каждого слота,  и финальное: при сохранении проверяем данные version из предметов и у слота на карте, не сходятся? тогда кумбек

    Share this comment


    Link to comment
    Share on other sites
    1 час назад, Electr0 сказал:

    примерный вариант фикса: 

    в базе данных слотов добавляем поле version оно будет зашиваться при сохранении слота прибавляя +1 при каждом сохранении. далее во время сохранения во время прошивки слота предметам заодно прошиваем и номер version , при входе на сервер во время сборки данных о названиях слотов и количества предметов в них заодно записываем значение version каждого слота,  и финальное: при сохранении проверяем данные version из предметов и у слота на карте, не сходятся? тогда кумбек

    так.. а ведь это не закроет проблему когда игрок просто загрузил слот на двух мегах по очереди и пошел продавать с них предметы.

     

    Нужен более извращенный метод возможно придется записывать в базу данных загруженные в данный момент слоты игроков, если есть информация что слот загружен на другом сервере то игроку доступна только загрузка слота и не более. В таком случае если происходит рестарт раунда, пометка что слот не загружен,  смена карты, нужно делать запрос в базу данных об удалении записи загруженности слота. Главное в этом способе это обеспечить наиболее надежную работу записи статуса слота в базу данных любые изменения статуса слота должны быть отражены иначе пострадает возможность игрока делать со слотом легитимные вещи.

     

    при старте карты сервер обязан отчитатся в таблицу статусов слотов о данных по загруженности слотов игроков.

    Share this comment


    Link to comment
    Share on other sites

    в случае потери соединения сервера с интернетом и не выхода на связь больше он не сможет сказать что слот игрока нигде не загружен, этот метод по этому параметру тоже такой себе способ получается. В таком случае для обхода этого исключения нужно добавлять epochstamp времени и если запись в базе данных старше 5 минут то ее во время сеанса связи нужно удалить и не брать в расчет. Сервер же должен раз в 2-4 минуты подтверждать статус слота.

    Share this comment


    Link to comment
    Share on other sites

    метод 3:

     

    что если во время загрузки слота записывать и прибавлять число загрузок слота.

    Допустим загрузили слот на приватной меге:

    после чего его число загрузок стало 1

    пошли на обычную мегу число загрузок стало 2

    вернулись на приватный сервер там у загруженного слота число загрузок 1, а по базе данных 2, значит слот невалидный и загружался где-то еще, шлем на три стороны света вынуждая игрока удалить слот с карты и загрузить снова чтобы он мог снова сохранять слот или что-то еще что требует сохранения данных слота в базу данных. точно такую же проверку делаем при операциях сохранения или продажи.

    Share this comment


    Link to comment
    Share on other sites

    метод 3 взят в работу, других логических исключений пока не нашел.

    Share this comment


    Link to comment
    Share on other sites

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

    Share this comment


    Link to comment
    Share on other sites
    • внедрена запись последней активности слота перед тем как начать загрузку предметов из базы данных.
    • внедрена выгрузка времени последней активности слота перед тем как начать сохранение предметов в базу данных
    • внедрена запись последней активности слота перед тем как начать сохранение предметов в базу данных
    • внедрена запись кеша активности слотов в файл
    • внедрена загрузка кеша активности слотов из файла при запуске плагина и выгрузка кеша активности слотов в файл при выгрузке плагина

     

    теперь это надо грамотно совместить.

    Share this comment


    Link to comment
    Share on other sites

    процесс тестирования  блокировки сохранения слота завершен, если обнаружена более поздняя операция со слотом то слот не даст себя сохранить. Теперь надо внедрять это во все остальное.

    Share this comment


    Link to comment
    Share on other sites

    Основная работа над допиливанием завершена, теперь надо добавить в остальное:

    • MoveObjectsFromSlotInSlotByType
    • SendSlotToPlayer
    • MoveObjectInSlot
    • SoldObject
    • SaveFileEraser (тут не нужно, слишком избыточно, то что игрок очистит слот ему ничего не даст)

    Share this comment


    Link to comment
    Share on other sites
    23.01.2020 в 23:28, Electr0 сказал:

    Основная работа над допиливанием завершена, теперь надо добавить в остальное:

    • MoveObjectsFromSlotInSlotByType
    • SendSlotToPlayer
    • MoveObjectInSlot
    • SoldObject
    • SaveFileEraser (тут не нужно, слишком избыточно, то что игрок очистит слот ему ничего не даст)

    все запросы на запись вынесены в отдельную функцию чтобы не повторять одно и тоже во всех добавляемых к проверке функциях со слотами.

    Share this comment


    Link to comment
    Share on other sites


    Join the conversation

    You can post now and register later. If you have an account, sign in now to post with your account.

    Guest
    Add a comment...

    ×   Pasted as rich text.   Paste as plain text instead

      Only 75 emoji are allowed.

    ×   Your link has been automatically embedded.   Display as a link instead

    ×   Your previous content has been restored.   Clear editor

    ×   You cannot paste images directly. Upload or insert images from URL.


  • Обозначения статусов

    В обработке = Мы работаем над вашим отчетом.

    Исправлено = Проблема исправлена.

    Тестируется = Изменения внесены, но требуют тестирования.

    Закрыт = Отзыв некорректный, либо проблема не повторяется при проверке на серверах. Если у вас есть дополнительная информация напишите комментарий и мы снова откроем этот вопрос.

×
×
  • Create New...