Вход

Просмотр полной версии : [Вопрос] Логика Promocode



execution
05.07.2020, 15:24
В планах было осуществить получение награды за промокод в режиме онлайн. Затрудняюсь с адекватным выбором реализации.

1. При заходе записывать не полученные промокоды и ежесекундно перебирать циклом (но что, если их будет много? сразу удалять все использованные промокоды или как? Либо же создать лимит на введённые промокоды?)
2. Каждую секунду (или же больше) отправлять запрос на не полученные награды за промо в бд? (Но не будет ли это затратно и т.п.?)

tnc
05.07.2020, 16:59
Не совсем понял, что конкретно хочешь? Если ты делаешь, как на традиционных серверах в SA-MP (RolePlay проекты), там же обычно по достижению определенного лвла, выдает "бусты" на аккаунт.

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

P.S: Я ещё раз скажу, что не понял, что ты конкретно хочешь

execution
05.07.2020, 17:05
Не совсем понял, что конкретно хочешь? Если ты делаешь, как на традиционных серверах в SA-MP (RolePlay проекты), там же обычно по достижению определенного лвла, выдает "бусты" на аккаунт.

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

P.S: Я ещё раз скажу, что не понял, что ты конкретно хочешь

Не, например отыграть 8ч и получите 50.000$

DeimoS
05.07.2020, 17:24
Не, например отыграть 8ч и получите 50.000$

Промокоды - это не то, что ты описал. Это, например, когда игрок вводит в диалог "UGFGGG7DD" или "execution" и получает какой-то приз, после чего этому игроку (или всем игрокам) этот промокод уже будет недоступен.

А то, что ты написал - это обычная система достижений с призами. И никакие проверки по таймерам тут не нужны. Конкретно в описанном твоём случае ты просто опираешься на систему подсчёта онлайна (если она есть. А если нет - пишешь её) и уже когда игрок отыграл 8 или более часов - выдаёшь приз и записываешь в переменную, что игрок получил вознаграждение. Всё.

execution
05.07.2020, 19:35
Промокоды - это не то, что ты описал. Это, например, когда игрок вводит в диалог "UGFGGG7DD" или "execution" и получает какой-то приз, после чего этому игроку (или всем игрокам) этот промокод уже будет недоступен.

А то, что ты написал - это обычная система достижений с призами. И никакие проверки по таймерам тут не нужны. Конкретно в описанном твоём случае ты просто опираешься на систему подсчёта онлайна (если она есть. А если нет - пишешь её) и уже когда игрок отыграл 8 или более часов - выдаёшь приз и записываешь в переменную, что игрок получил вознаграждение. Всё.

Да это понятно. Проблема была в выборе правильной реализации (подробнее описал в первом комментарии)

tnc
05.07.2020, 21:09
Да это понятно. Проблема была в выборе правильной реализации (подробнее описал в первом комментарии)

Ну, а в чем проблема? 8 часов, как правило это 8 зарплат на RolePlay сервере, сохраняй онлайн в таблице (если нужно, чтобы после перезахода, а не подряд был "квест")

DeimoS
10.07.2020, 22:53
Да это понятно. Проблема была в выборе правильной реализации (подробнее описал в первом комментарии)

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

MassonNN
11.07.2020, 09:13
Рассказываю как я сделал у себя промокоды (возможно ты именно так и хочешь сделать).

У меня просто есть база данных с промокодами,там прописаны все условия получения, количество денег/опыта/дней випки и т.д. Когда игрок вводит промокод, этот код добавляется к нему в базу данных с помощью CONCAT. А при вводе промокода идёт проверка через SELECT * FROM account WHERE promoused LIKE '%%e%' AND Name = '%s'
Таким образом, если он уже использовал этот промокод, то он не может его ввести.

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

DeimoS
11.07.2020, 10:27
Рассказываю как я сделал у себя промокоды (возможно ты именно так и хочешь сделать).

У меня просто есть база данных с промокодами,там прописаны все условия получения, количество денег/опыта/дней випки и т.д. Когда игрок вводит промокод, этот код добавляется к нему в базу данных с помощью CONCAT. А при вводе промокода идёт проверка через SELECT * FROM account WHERE promoused LIKE '%%e%' AND Name = '%s'
Таким образом, если он уже использовал этот промокод, то он не может его ввести.

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

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

id | account_id | promocode_id
Где:
id - AUTO_INCREMENT
А для account_id и promocode_id создаются индексы (можно даже сделать составной индекс для пущей скорости обработки, если не планируется делать какую-то выборку только по promocode_id или account_id).

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

execution
11.07.2020, 16:24
Рассказываю как я сделал у себя промокоды (возможно ты именно так и хочешь сделать).

У меня просто есть база данных с промокодами,там прописаны все условия получения, количество денег/опыта/дней випки и т.д. Когда игрок вводит промокод, этот код добавляется к нему в базу данных с помощью CONCAT. А при вводе промокода идёт проверка через SELECT * FROM account WHERE promoused LIKE '%%e%' AND Name = '%s'
Таким образом, если он уже использовал этот промокод, то он не может его ввести.

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

Нет, я не имел ввиду "как реализовать систему Promocode", а интересовало конкретно "как реализовать корректную проверку отыгранного времени для получения приза промокода в реальном времени".

DeimoS
11.07.2020, 17:57
Ну так с этого и стоило начинать.

Если это нужно сугубо для того, чтоб ачивку проверять (хотя можно и обычный подсчёт времени онлайна так сделать) - при входе записываешь текущее UNIX-время + в ещё одну переменную выгружаешь время прошлого онлайна за сегодня. Далее запускаешь таймер, например, на минуту и в таймере, узнав текущее UNIX-время, отнимаешь от него записанное время при входе и результат приплюсовываешь ко второй переменной (сохраняя её значение в таблицу), а первую (с UNIX-временем) обновляешь, записывая в неё актуальное время. И так каждое срабатывание таймера.
При выходе с сервера делаешь то же самое, что и в таймере (узнаёшь отыгранное количество секунд с момента последнего срабатывания таймера и записываешь его в переменную).