Иконка ресурса

Player preferences 1.0.7

Нет прав для скачивания

d3m37r4

Скриптер
Постоялец
Регистрация
8 Июн 2017
Сообщения
742
Симпатии
393
Пол
Мужской
Telegram
@dmitry_isakow
d3m37r4, вчера так делал, много играл с кодом - не было такого, закрывало соединение сразу и все тип топ. Но если же попадется такая беда придется хотфиксить булевым пластырем =(
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
d3m37r4, понял, сделаю
 

d3m37r4

Скриптер
Постоялец
Регистрация
8 Июн 2017
Сообщения
742
Симпатии
393
Пол
Мужской
Telegram
@dmitry_isakow
До SQL_FreeHandle(sConnection); в случае ретурна выше дело не дойдет.
C++:
public sql_test_init() {
    new Handle: sConnection;

    g_hTuple = SQL_MakeDbTuple(
        dbdata[host],
        dbdata[user],
        dbdata[pass],
        dbdata[db]
    );

    new errCode, error[512];
    sConnection = SQL_Connect(g_hTuple, errCode, error, charsmax(error));

    if (sConnection == Empty_Handle)    {
        SQL_FreeHandle(g_hTuple);
        log_amx("[PP] Error connecting to db '%s': #%d: %s", dbdata[db], errCode, error);

        return;
    }

    server_print("[PP] Connection to '%s' database success", dbdata[db]);

    SQL_FreeHandle(sConnection);
}

C++:
    new status[4];
    get_plugin(plugin, .status = status, .len5 = charsmax(status));
    DEBUG = !!(status[0] == 'd');
Проверить, запущен-ли плагин в режиме дебага можно проще, но это уже так.
C++:
DebugMode = bool: plugin_flags() & AMX_FLAG_DEBUG);
 

d3m37r4

Скриптер
Постоялец
Регистрация
8 Июн 2017
Сообщения
742
Симпатии
393
Пол
Мужской
Telegram
@dmitry_isakow
UPD: про SQL_FreeHandle(sConnection) бред написал, сорян)
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
cpCTRL обновил(а) ресурс Player preferences новой записью:

Исправление ошибок с БД и массивом JSON

За частичные тесты спасибо Limbooc
За подсказки d3m37r4

* Убран лишний аргумент в запросе в БД при сохранении (SET в ODKU не используется)
* Исправлено выкидывание ошибок при загрузке неправильных данных с БД
* Создание массива JSON игроку возвращено с изначальное место, так как если у него были загружены нераспознанные жсоном данные, массив не создавался, что мешало сделать апдейт и установить новые при дисконнекте
Узнать больше об этом обновлении...
 

angrybot

Администратор
Модератор
Разработчик
Постоялец
Пользователь
Дизайнер
Регистрация
15 Дек 2019
Сообщения
166
Симпатии
60
Драйвер по-моему старый.

1 база вообще платная.
популярность как расчитана? по покупкам enterpise?
 

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
357
Пол
Мужской
angrybot, наверно, потому что я нигде не вижу где там можно лайк или дизлайк поставить за какую-то определенную базу)))
Откуда они эти "Очки" берут хз )
 

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
357
Пол
Мужской
А как изменить что бы было привязано к никнейму + стим?

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


Так будет работать ? и `auth` varchar(36) на `auth` varchar(128) надо заменить? и вообще MAX_AUTHID_LENGTH == 64, а в Init.sql там всего 36 символов выделяется?
 

Вложения

Последнее редактирование:

angrybot

Администратор
Модератор
Разработчик
Постоялец
Пользователь
Дизайнер
Регистрация
15 Дек 2019
Сообщения
166
Симпатии
60
автору нужно мыслить шири:

C++:
new buffer[128], szAuth[MAX_AUTHID_LENGTH];
    get_user_authid(id, szAuth, MAX_AUTHID_LENGTH - 1);
    formatex(buffer, charsmax(buffer), "SELECT `auth`, `data` FROM `%s` WHERE `auth` = '%s'", dbdata[table], szAuth);

видишь что передается steamid?
во первых это не правильно.

нужна возможность вызывать load_player когда это нужно пользователям, позволить им указывать идентификатор, возможно передавать его параметрами.

то есть тебе нужно создать второй плагин:
player_preferences_api.sma

в client_putinserver которого по умолчанию будет вызываться load_player(id, authid[], length, local_id);

четвертый параметр нужен для того чтобы передавать его затем в каллбек форварда, чтобы разные плагины могли в одно и тоже время обрабатывать нужные им сообщения, если вдруг какой-то из плагинов решит вызывать load_player тоже, независимо от того вызывает ли его уже кто-то другой или нет.
но можно пока что без нево, authid это строка которая будет формироваться скриптером или владельцем сервера, примерный код:

C++:
    register_native("pp_load_player", "native_load_player");


static const LocalPlayerPreferencesFwdId = 1234567890;

public client_putinserver(id) {
    new buffer[128], szAuth[MAX_AUTHID_LENGTH];
    get_user_authid(id, szAuth, MAX_AUTHID_LENGTH - 1);

    // это просто пример, не надо так писать это не правильно
#if defined LOAD_BY_STEAM_NICKNAME
    format(buffer, charsmax(buffer), "%n_%N", id, id);
#else
    format(buffer, charsmax(buffer), "%N", id);
#endif
    pp_load_player
    (
        id,
        buffer,
        charsmax(buffer), /* или можешь считать lenght, не надежно без знаний как он работает */
        LocalPlayerPreferencesFwdId
    );
}

public player_loaded(id, callee) {
    if(callee == LocalPlayerPreferencesFwdId) {
        playerLoaded(id);

        return 1;
    }

    return 0;
}

playerLoaded(id) {
    log_amxx("Player %d %n loaded", id, id);
}

pp_load_player должен проверять передан ли buffer или нет и если он пуст то самостоятельно брать базовый идентификатор например steamid

переименуй player_loaded форвард во что нибудь с префиксом, ты занял целое имя под форвард.
 
Последнее редактирование:

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
angrybot, спасибо за конструктивность, займусь этим как будет время
 

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
357
Пол
Мужской
А на счет Init.sql , MAX_AUTHID_LENGTH используемый в коде это 64, а в init.sql auth равен 36, это нормально?
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
karaulov, можешь поправить, бустапа не будет . Позже перенесу создание таблицы в плагин
 

Nelpsen

Пользователь
Регистрация
9 Июл 2017
Сообщения
59
Симпатии
27
Пол
Мужской
cpCTRL, использование client_putinserver не безопасно, можешь получить пустой стимайди игрока.

Код:
/**
/**
 * Called when the client gets a valid SteamID.
 *
 * @note This may occur before or after client_putinserver has been called.
 * @note This is called for bots, and the SteamID will be "BOT".
 *
 * @param id        Client index
 * @param authid    Client auth
 *
 * @noreturn
 */
forward client_authorized(id, const authid[]);
*/
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
Nelpsen, в новой версии уже учтено, спасибо
 

georgeml

Скриптер
Постоялец
Регистрация
12 Сен 2017
Сообщения
595
Симпатии
314
@note This may occur before or after client_putinserver has been called.
Чушь какая-то

C++:
BOOL C_ClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128])
{
    CPlayer* pPlayer = GET_PLAYER_POINTER(pEntity);
    if (!pPlayer->IsBot())
    {
        bool a = pPlayer->Connect(pszName, pszAddress);
        executeForwards(FF_ClientConnect, static_cast<cell>(pPlayer->index));

        if (a)
        {
            auto playerToAuth = ke::AutoPtr<CPlayer *>(new CPlayer*(pPlayer));
            if (playerToAuth)
                g_auth.append(ke::Move(playerToAuth));
        } else {
            pPlayer->Authorize();
            const char* authid = GETPLAYERAUTHID(pEntity);
            if (g_auth_funcs.size())
            {
                List<AUTHORIZEFUNC>::iterator iter, end=g_auth_funcs.end();
                AUTHORIZEFUNC fn;
                for (iter=g_auth_funcs.begin(); iter!=end; iter++)
                {
                    fn = (*iter);
                    fn(pPlayer->index, authid);
                }
            }
            executeForwards(FF_ClientAuthorized, static_cast<cell>(pPlayer->index), authid);
        }
    }

    RETURN_META_VALUE(MRES_IGNORED, TRUE);
}
C++:
    ClientConnect
    from dlls/client.cpp:
    BOOL ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]);

        Called when a player connects to a server.

    comments:

        Called on initial connect, just after hlds reports "connected", ie:

            "John<1><WON:9856723>" connected, address "127.0.0.1:27005"

        This is before the user begins downloading, or anything else.
C++:
    ClientPutInServer
    from dlls/client.cpp:
    void ClientPutInServer(edict_t *pEntity);

        Called each time a player is spawned.

    comments:

        Called after the client has uploaded/download all necessary resources, just after hlds reports "entered the game", ie:

           "John<1>" has entered the game
Думаю, логическую цепочку вызовов не сложно будет составить
 

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
357
Пол
Мужской
angrybot, может проще уже в существующую конфигурацию preferences.json добавить возможность выбора типа идентификатора пользователя?

Например "Steam, Username + Steam, ..."

Вот так должно работать но пока проверить не смогу, может кто-нибудь проверит. Внес изменения в код, init.sql, и в preferences.json по умолчанию SteamID + CRC32(USERNAME) будет сохранять.

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


C++:
    new g_iSaveType = 0;
...
    json_object_get_string(config, "save_type", temp, charsmax(temp));
    g_iSaveType = str_to_num(temp);
...
    new buffer[128], szAuth[MAX_AUTHID_LENGTH];
    new name[64], hash[64];
    get_user_name(id,name,charsmax(name))
    hash_string(name,Hash_Crc32,hash,charsmax(hash));
    get_user_authid(id, szAuth, MAX_AUTHID_LENGTH - 1);

    if (g_iSaveType == 1)
        formatex(buffer, charsmax(buffer), "SELECT `auth`, `data` FROM `%s` WHERE `auth` = '%s'", dbdata[table], szAuth);
    else if (g_iSaveType == 2)
        formatex(buffer, charsmax(buffer), "SELECT `auth`, `data` FROM `%s` WHERE `auth` = '%s-%s'", dbdata[table], szAuth, hash);
    else
        formatex(buffer, charsmax(buffer), "SELECT `auth`, `data` FROM `%s` WHERE `auth` = '%s'", dbdata[table], szAuth);

...

    new buffer[1024], serial[612];
    new auth[MAX_AUTHID_LENGTH];
    new name[64], hash[64];
    get_user_name(id,name,charsmax(name))
    hash_string(name,Hash_Crc32,hash,charsmax(hash));
    get_user_authid(id, auth, charsmax(auth));
    json_serial_to_string(g_jObject[id], serial, charsmax(serial));
   
    if (g_iSaveType == 1)
        formatex(buffer, charsmax(buffer), "INSERT INTO `%s` (`auth`, `data`) VALUES ('%s-%s', \
        '%s') ON DUPLICATE KEY UPDATE `data` = '%s';", dbdata[table], auth, hash, serial, serial);
    else if (g_iSaveType == 2)
        formatex(buffer, charsmax(buffer), "INSERT INTO `%s` (`auth`, `data`) VALUES ('%s', \
        '%s') ON DUPLICATE KEY UPDATE `data` = '%s';", dbdata[table], auth, serial, serial);
    else
        formatex(buffer, charsmax(buffer), "INSERT INTO `%s` (`auth`, `data`) VALUES ('%s', \
        '%s') ON DUPLICATE KEY UPDATE `data` = '%s';", dbdata[table], auth, serial, serial);
 

Вложения

steelzzz

Скриптер
Регистрация
9 Июн 2017
Сообщения
168
Симпатии
24
Пол
Мужской
angrybot, может проще уже в существующую конфигурацию preferences.json добавить возможность выбора типа идентификатора пользователя?

Например "Steam, Username + Steam, ..."

Вот так должно работать но пока проверить не смогу, может кто-нибудь проверит. Внес изменения в код, init.sql, и в preferences.json по умолчанию SteamID + CRC32(USERNAME) будет сохранять.

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


C++:
    new g_iSaveType = 0;
...
    json_object_get_string(config, "save_type", temp, charsmax(temp));
    g_iSaveType = str_to_num(temp);
...
    new buffer[128], szAuth[MAX_AUTHID_LENGTH];
    new name[64], hash[64];
    get_user_name(id,name,charsmax(name))
    hash_string(name,Hash_Crc32,hash,charsmax(hash));
    get_user_authid(id, szAuth, MAX_AUTHID_LENGTH - 1);

    if (g_iSaveType == 1)
        formatex(buffer, charsmax(buffer), "SELECT `auth`, `data` FROM `%s` WHERE `auth` = '%s'", dbdata[table], szAuth);
    else if (g_iSaveType == 2)
        formatex(buffer, charsmax(buffer), "SELECT `auth`, `data` FROM `%s` WHERE `auth` = '%s-%s'", dbdata[table], szAuth, hash);
    else
        formatex(buffer, charsmax(buffer), "SELECT `auth`, `data` FROM `%s` WHERE `auth` = '%s'", dbdata[table], szAuth);

...

    new buffer[1024], serial[612];
    new auth[MAX_AUTHID_LENGTH];
    new name[64], hash[64];
    get_user_name(id,name,charsmax(name))
    hash_string(name,Hash_Crc32,hash,charsmax(hash));
    get_user_authid(id, auth, charsmax(auth));
    json_serial_to_string(g_jObject[id], serial, charsmax(serial));
  
    if (g_iSaveType == 1)
        formatex(buffer, charsmax(buffer), "INSERT INTO `%s` (`auth`, `data`) VALUES ('%s-%s', \
        '%s') ON DUPLICATE KEY UPDATE `data` = '%s';", dbdata[table], auth, hash, serial, serial);
    else if (g_iSaveType == 2)
        formatex(buffer, charsmax(buffer), "INSERT INTO `%s` (`auth`, `data`) VALUES ('%s', \
        '%s') ON DUPLICATE KEY UPDATE `data` = '%s';", dbdata[table], auth, serial, serial);
    else
        formatex(buffer, charsmax(buffer), "INSERT INTO `%s` (`auth`, `data`) VALUES ('%s', \
        '%s') ON DUPLICATE KEY UPDATE `data` = '%s';", dbdata[table], auth, serial, serial);
if (g_iSaveType == 1) и else ничем не отличаются
 

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
357
Пол
Мужской
steelzzz, ну потому что 3 варианта нет :) (по умолчанию просто SteamID)

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