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

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±

    Логика снятия варна.

    Доброго времени суток, у меня случился ступор, при создании системы варнов, ступор вот в чём, я не могу придумать логику снятия варнов.
    Конкретнее о системе:

    В аккаунте игрока, я сделал 2 ячейки, где записываю количество варнов, а во второй, время его снятия в unix времени.

    Сделал базу данных варнов.
    Где заношу, mysql_id, mysql_id игрока,ник игрока, кто выдал, и когда будет снят

    Осталось дело за малым казалось бы придумать логику снятия варнов, но, что-то пошло не так, и я просто не могу её придумать...

    Допустим, у игрока в БД, уже 4 варна.
    Нужно чтобы каждый из них снялся в свое время, в таймере игрока уже сделал проверку на снятие варнов...

    Допустим 3-тий варн в время которое в БД с варнами, 1-варн в другое время так-же из БД с варнами
    Последний раз редактировалось Сергей; 05.10.2019 в 02:50.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Как вариант: сделать для каждого варна свой столбец, записывая только время снятия этого варна. Просто и эффективно
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Как вариант: сделать для каждого варна свой столбец, записывая только время снятия этого варна. Просто и эффективно
    Так их же может быть 100500, или в одном столбце через разделитель записать?
    Я вот думаю над тем, чтобы сделать для каждого варна свой уникальный номер, и этот уникальный номер записывать в столбец.
    Только может случится, дублирование этого самого номера
    Последний раз редактировалось Сергей; 05.10.2019 в 16:29.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Сергей Посмотреть сообщение
    Так их же может быть 100500, или в одном столбце через разделитель записать?
    Я вот думаю над тем, чтобы сделать для каждого варна свой уникальный номер, и этот уникальный номер записывать в столбец.
    Только может случится, дублирование этого самого номера
    Эмм, тогда создай отдельную таблицу и в неё записывай ID аккаунта + время снятия варна.
    Через разделитель ничего и никогда в БД не записывай.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, тогда создай отдельную таблицу и в неё записывай ID аккаунта + время снятия варна.
    Через разделитель ничего и никогда в БД не записывай.
    Почему? Не записывать через разделитель?

    Вот ещё мысля, сделать может массив, в него грузить данные например:

    PHP код:
    #define MAX_LOAD_WARN 100

    enum pLoadWarn
    {
        
    wr_mysql_id,
        
    wr_deleted[MAX_LOAD_WARN]
    };
    new 
    LoadWarn[MAX_PLAYERS][pLoadWarn]; 
    И при загрузке аккаунта, делать запрос в бд, и грузить, только вот как правильно их грузить сюда, и потом уже использовать, что-то понять не могу...


    О, вот что получилось, есть ли варианты по лучше этого, что я тут на строил?

    PHP код:
    @LoadWarnPlayerCallBack(playerid);
    @
    LoadWarnPlayerCallBack(playerid)
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields,MysqlConnect);
        
        new 
    wr_max_ID cache_get_row_count(MysqlConnect);
        if(
    wr_max_ID == 0) return 1;
        new 
    lload 0;
        while(
    lload wr_max_ID)
        {
            for(new 
    0rowsi++) 
            {
                
    LoadWarn[playerid][wr_deleted][lload] = cache_get_field_content_int(i,"w_deleted"MysqlConnect); 
            }
            
    lload++;
        }
        return 
    1;

    Последний раз редактировалось Сергей; 05.10.2019 в 20:19.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Через разделитель не записывать, ибо в этом нет никакого смысла. Ты лишь усложняешь читаемость и работу с данными. Для MySQL ты лучше не делаешь. БД прекрасно работает и с таблицами, в которых несколько сотен столбцов.


    Тебе нужно либо определиться с ограничением на максимальное число предупреждений, либо реализовывать всё так, чтоб все взаимодействия с варнами были напрямую через БД.
    Касаемо кода, который ты дал: не совсем понятно зачем там цикл while. Ты просто, грубо говоря, 100 раз подряд будешь загружать одну и ту же информацию с текущим кодом.
    1. @LoadWarnPlayerCallBack(playerid);
    2. @LoadWarnPlayerCallBack(playerid)
    3. {
    4. new rows = cache_get_row_count(MysqlConnect);
    5. if(rows == 0)
    6. return 1;
    7. for(new i = 0; i < rows; i++)
    8. {
    9. LoadWarn[playerid][wr_deleted][i] = cache_get_field_content_int(i,"w_deleted", MysqlConnect);
    10. }
    11. return 1;
    12. }

    Ну и да, лучше создать индекс для столбца с ником или ID аккаунта (в зависимости от того, как хранишь данные). Это увеличит размер таблицы, но ускорит выборку данных в твоём случае.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Через разделитель не записывать, ибо в этом нет никакого смысла. Ты лишь усложняешь читаемость и работу с данными. Для MySQL ты лучше не делаешь. БД прекрасно работает и с таблицами, в которых несколько сотен столбцов.


    Тебе нужно либо определиться с ограничением на максимальное число предупреждений, либо реализовывать всё так, чтоб все взаимодействия с варнами были напрямую через БД.
    Касаемо кода, который ты дал: не совсем понятно зачем там цикл while. Ты просто, грубо говоря, 100 раз подряд будешь загружать одну и ту же информацию с текущим кодом.
    1. @LoadWarnPlayerCallBack(playerid);
    2. @LoadWarnPlayerCallBack(playerid)
    3. {
    4. new rows = cache_get_row_count(MysqlConnect);
    5. if(rows == 0)
    6. return 1;
    7. for(new i = 0; i < rows; i++)
    8. {
    9. LoadWarn[playerid][wr_deleted][i] = cache_get_field_content_int(i,"w_deleted", MysqlConnect);
    10. }
    11. return 1;
    12. }

    Ну и да, лучше создать индекс для столбца с ником или ID аккаунта (в зависимости от того, как хранишь данные). Это увеличит размер таблицы, но ускорит выборку данных в твоём случае.
    Спасибо за совет, но, я до думался как сделать ещё более эффективно в данный момент.
    Вообщем, у меня же есть таблица, условно назовем её "table_warn"
    В ней данные, mysql_id, id_acc, name_acc,reason,data_unwarn(unix)
    Я сделал таймер 10 минутный, в этом таймере сделал вот какую конструкцию, даю запрос в таблицу аккаунтов
    PHP код:
    mysql_function_query(MysqlConnect"SELECT * FROM `"table_acc"` WHERE `warns`!='0'"true"@Check_WARN"""); 
    Сразу же пытаюсь выяснить по всем аккаунтов, у кого есть варны, чтобы отсеять лишних людей.
    Далее, загрузил данные, а именно mysql_id - аккаунта, и количество варнов, и сделал новый запрос, НО, в таблицу с варнами, где загружаю дату снятия варна а именно: data_unwarn(unix) и в новом паблике, сравниваю текущие время unix с загруженными данными, и всё, если текущие время больше загруженного, отправляю данный варн в небытие, архив имеется ввиду)

    Так вот теперь вопрос, этот вариант, он не слишком ли затратный? Ибо этот вариант как по мне является очень практичным.
    Последний раз редактировалось Сергей; 06.10.2019 в 02:03.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, загружать кучу раз в день одну и ту же информацию - это далеко не "более эффективно".

    Для игроков в онлайне загружай данные в массив при авторизации на сервере и уже дальше с данными работай на сервере.
    Для игроков в оффлайне делай проверку в OnGameModeInit и снимай все варны без подгрузок данных на сервере, а через DELETE-запрос.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  9. #9
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Закрываем.

 

 

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

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

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

Ваши права

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