Форум Pawn.Wiki - Воплоти мечту в реальность!: Система управления деньгами игроков - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (5 Страниц) +
  • « Первая
  • 3
  • 4
  • 5
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Система управления деньгами игроков money Оценка: ***** 1 Голосов

#41
Пользователь офлайн   execution88 

  • Местный
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияM I S T E V (18 апреля 2025 - 23:49) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

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

#42
Пользователь онлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияexecution88 (19 апреля 2025 - 13:10) писал:

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

Я могу ответить лишь, что система не для "про" скриптеров, а для новичков. Чтобы реализовать подобные логи, нужно следить и знать, где и как что применить. Если для кого-то подобные логи - норма, я ж не спорю, так и должно быть, по ID. Лучше всего через отдельную таблицу, но ты объясни новичку, что для каждого действия нужно создать новую строку в базе, потом при запуске мода получить этот ID и занести в переменную, а потом ещё правильно применить. И что ни в коем случае нельзя менять этот ID, иначе смысла от подобного сразу 0. Теперь возьмём эту реализую, просто добавляешь комментарий внутри мода конкретно в нужном месте. Это не требует каких-то глубоких познаний в pawn :blush:

Ещё раз, если кто-то хочет брать это под основу, вряд ли он будет заморачиваться над ID логов, а если он не будет, зачем мне делать систему под ID, если это только усложняет жизнь обычным пользователям? Я вот этого не совсем понимаю. Если ты берёшь это под основу, заходишь в инклуд, убираешь [] из функций, в создании таблицы VARCHAR меняешь на INT. Всё? :rolleyes:
0

#43
Пользователь офлайн   Coquette 

  • Местный
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияexecution88 (19 апреля 2025 - 13:10) писал:

Не особо понимаю, чего ты на любые действия спихиваешь на тяжесть для кого-то)

Если ты соизволишь взглянуть на сообщения пользователя Cetoenix, то сможешь понять что некоторым людям доставляет сложность банально подключить инклуд на этом этапе, а ты хочешь чтобы MISTEV сделал ещё более сложно, что заставит кучу людей, как Cetoenix писать сюда по как нам кажется, "простым вопросам".
1

#44
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияM I S T E V (19 апреля 2025 - 13:50) писал:

для каждого действия нужно создать новую строку в базе, потом при запуске мода получить этот ID и занести в переменную


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

Просмотр сообщенияM I S T E V (19 апреля 2025 - 13:50) писал:

, а потом ещё правильно применить


Правильно применить? Прописать название константы вместо текста, то есть? Это ещё проще, чем с текстом.

Просмотр сообщенияM I S T E V (19 апреля 2025 - 13:50) писал:

И что ни в коем случае нельзя менять этот ID, иначе смысла от подобного сразу 0.


Почему же? Что тебе мешает в своём скрипте проверять совпадение названий в массиве с записанными названиями, удаляя/заменяя всё, что уже не актуально? Или что мешает в enum сделать явное указание ID константы, чтоб все новые типы логов всегда добавлялись как новый ID?


Просмотр сообщенияM I S T E V (19 апреля 2025 - 13:50) писал:

Теперь возьмём эту реализую, просто добавляешь комментарий внутри мода конкретно в нужном месте. Это не требует каких-то глубоких познаний в pawn :blush:


Так и вариант с константами не требует. Ты буквально делаешь 5 строк описания того, как работать с enum, и всё. При этом, твоя система логов превращается в полноценную полезную систему, а не просто в заглушку, которую нужно переписывать сразу же, как только хоть какого-нибудь опыта наберёшься в MySQL и как только решишь открывать сервер на основе мода с твоей системой.

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

P.S. Дело, конечно, твоё, но оправдание: "Система создана для новичков", - в ответ на заявление о бессмысленности и вредности твоей системы, звучит немного странновато :)

Сообщение отредактировал DeimoS: 19 апреля 2025 - 14:58

0

#45
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияCoquette (19 апреля 2025 - 14:48) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


То, что кому-то настолько лень напрягаться, не значит, что нужно откровенно говнокодить при работе с БД (да и с модом тоже, ибо каждая запись причины лога будет отдельное место в оперативке занимать) :)
Не говоря уже о том, что и сам факт говнокодинга совершенно не уменьшает шансов того, что условный Cetoenix не придёт опять со странными вопросами, которые элементарно решаются.

P.S. Опять же, если нам по какой-то непонятной причине всё ещё очень хочется сделать так, чтоб пользователи скрипта каждый раз писали описание лога вручную (что так-то заставит людей помнить все описания, чтоб использовать их повторно там, где действие схожее) - это всё ещё не мешает нам "под капотом" реализовать нормальную работу с БД, автоматически проверяя существование переданного в функцию описания. Это будет более костыльно, чем нормальная реализация, но всё ещё лучше, чем то, что есть сейчас.

Сообщение отредактировал DeimoS: 19 апреля 2025 - 15:11

0

#46
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
К слову, текущий перехват mysql_connect - крайне сомнительная идея.
Во-первых, подключение может происходить через mysql_connect_file.
Во-вторых, в моде может быть подключение к нескольким БД сразу (например, к БД сервера и к БД сайта). Соответственно, ты свою таблицу для каждой БД создашь.
Разумнее просто просить передать переменную с ID подключения в какую-то твою функцию, где ты уже запишешь ID и дальше будешь его использовать.

К тому же, не мешало бы сделать нормальную обработку ошибок для запроса на создание таблицы, ибо у юзера, под которым подключается сервер, вполне может не быть прав доступа на создание таблиц (что будет правильно, ибо это является дополнительной защитой от SQL-инъекций, например).




Да и временную метку лучше записывать в столбец datetime, а не просто в int (и при вставке/загрузке просто оборачивать значение из "gettime()" в "FROM_UNIXTIME"/"UNIX_TIMESTAMP(unix)"). Ну если мы, конечно, хотим использовать MySQL по назначению и иметь возможность делать выборку данных, а не просто писать в таблицу как в файл.

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

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

И раз уж мы тут систему для новичков делаем, то разумнее было бы все запросы делать через mysql_format, используя "%e" для тех данных. которые приходят в инклуд извне.

Сообщение отредактировал DeimoS: 19 апреля 2025 - 15:32

1

#47
Пользователь онлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Обновлено. Новая версия не совместима со старой.

    ■    Теперь запись в логи происходит по reasonid (integer).

    ■    Удалены опции MONEY_SETTING_ON_SQL и MONEY_SETTING_OFF_AUTO_UPDATE.

    ■    Изменены названия всех опций.

    ■    Обновлено описание темы с примерами подключения.

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

    #define MONEY_SQL_TABLE_PLAYER "table_name"

    #define MONEY_PLAYER_COLUMN_ACCOUNT_ID "column_name"

    #define MONEY_PLAYER_COLUMN_MONEY "column_name"

    ■    Теперь необходимо передать ID подключения к базе данных после подключения с помощью функции:

    ConnectMoney(MySQL:sql)

    ■    Также нужно передать ID аккаунта игрока после регистрации/авторизации с помощью данной функции:

    ConnectPlayerMoney(playerid, accountid)

    ■    Изменена таблица логов. Столбцы accountid и reasonid проиндексированы.

    ■    Для изменения имени таблицы для логов или столбцов, вы можете использовать данные макросы:

    #define MONEY_SQL_TABLE_LOG "money_log"

    #define MONEY_LOG_COLUMN_DATE "date"

    #define MONEY_LOG_COLUMN_LOG_ID "logid"

    #define MONEY_LOG_COLUMN_ACCOUNT_ID "accountid"

    #define MONEY_LOG_COLUMN_REASON_ID "reasonid"

    #define MONEY_LOG_COLUMN_VALUE "value"

    ■    По умолчанию reasonid в функциях равна INVALID_MONEY_REASON (-1)

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

Сообщение отредактировал M I S T E V: 21 апреля 2025 - 11:16

0

#48
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Решил сделать с одной таблицей?




Просмотр сообщенияM I S T E V (19 апреля 2025 - 17:44) писал:

■    Изменена таблица логов. Столбец date получает время с базы данных, а не сервера.


Вот это тоже плохая идея) Нет гарантии, что у БД будет настроена правильно часовая зона. Поэтому лучше всё же передавать значение "gettime()"





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

И я бы предложил блокировать весь функционал, связанный с таблицами, если вдруг не удалось её создать. Либо вообще сервер ронять, чтоб человек точно увидел, что есть проблема.

Плюс можно корректность переданного ID подключения проверить каким-нибудь простеньким запросом, а-ля "SELECT 1".
0

#49
Пользователь онлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Обновлено.

    ■    Исправил получение времени из базы данных на получение времени с сервера с помощью функции gettime().

    ■    В случае, если какой-либо из этих макросов не создан (MONEY_SQL_TABLE_PLAYER, MONEY_PLAYER_COLUMN_ACCOUNT_ID, MONEY_PLAYER_COLUMN_MONEY), система не даст использовать функции ConnectMoney и ConnectPlayerMoney, а также указание причины в функциях будет невозможным.

Сообщение отредактировал M I S T E V: 20 апреля 2025 - 00:26

0

#50
Пользователь офлайн   execution88 

  • Местный
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияCoquette (19 апреля 2025 - 14:48) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Бред. Если человек не знаком с языком на базовом уровне, то вопросы будут постоянны.
0

Поделиться темой:


  • (5 Страниц) +
  • « Первая
  • 3
  • 4
  • 5
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика