Помощь с базой

Статус
В этой теме нельзя размещать новые ответы.

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace
Нужна помощ с базой sql
Проблема такая: Скилл по формуле ELO сохраняется в базу 100 но загружается 0
Код:
#include <amxmodx>
#include <sqlx>
#include <skill_elo>

#if AMXX_VERSION_NUM < 183
    #define client_disconnected client_disconnect
#endif

new Handle:g_SqlTuple
new g_Cvar[11], g_Error[512]
new szHost[64], szUser[64], szPass[64], szBase[64], szTable[64], szDriver[10]
new const g_arrItemSkills[] = {0, 60, 75, 85, 100, 115, 130, 140, 150, 165, 180, 195, 210}
new const g_arrViewSkills[][] = {"S_1", "S_2", "S_3", "S_4", "S_5", "S_6", "S_7", "S_8", "S_9", "S_10", "S_11", "S_12", "S_13"}
enum _:SKILL_DATA {KILLS, Float:Skill}
new g_user_skill[33][SKILL_DATA + 1]

public plugin_init()
{
    register_plugin("Skill The ELO Method", "1.0", "AcE")

    g_Cvar[1] = register_cvar("skill_start", "100")
    g_Cvar[2] = register_cvar("skill_need_frags", "100")
    g_Cvar[3] = register_cvar("skill_start_koef", "2.0")
    g_Cvar[4] = register_cvar("skill_next_koef", "1.5")

    g_Cvar[5] = register_cvar("skill_sql_host", "")
    g_Cvar[6] = register_cvar("skill_sql_user", "")
    g_Cvar[7] = register_cvar("skill_sql_pass", "")
    g_Cvar[8] = register_cvar("skill_sql_db", "")
    g_Cvar[9] = register_cvar("skill_sql_table", "")
    g_Cvar[10] = register_cvar("skill_sql_type", "mysql")

    register_event("DeathMsg", "EventDeath", "a", "1>0")
    register_dictionary("skill_elo.txt")
    set_task(1.0, "MySql_Init")
}

public plugin_cfg()
    server_cmd("exec addons/amxmodx/configs/skill_elo.cfg")

public client_putinserver(id) Load_MySql(id)
public client_disconnected(id) Save_MySql(id)
public plugin_end() SQL_FreeHandle(g_SqlTuple)

public EventDeath()
{
    new killer = read_data(1)
    new victim = read_data(2)
    if (killer == victim) return
    new Float:delta = 1.0 / (1.0 + floatpower(10.0, (g_user_skill[killer][Skill] - g_user_skill[victim][Skill]) / 100.0))
    g_user_skill[killer][Skill] += (g_user_skill[killer][KILLS] < get_pcvar_num(g_Cvar[2])) ? (delta * get_pcvar_float(g_Cvar[3])) : (delta * get_pcvar_float(g_Cvar[4]))
    g_user_skill[victim][Skill] -= (g_user_skill[victim][KILLS] < get_pcvar_num(g_Cvar[2])) ? (delta * get_pcvar_float(g_Cvar[3])) : (delta * get_pcvar_float(g_Cvar[4]))
}

public MySql_Init()
{
    get_pcvar_string(g_Cvar[5], szHost, charsmax(szHost))
    get_pcvar_string(g_Cvar[6], szUser, charsmax(szUser))
    get_pcvar_string(g_Cvar[7], szPass, charsmax(szPass))
    get_pcvar_string(g_Cvar[8], szBase, charsmax(szBase))
    get_pcvar_string(g_Cvar[9], szTable, charsmax(szTable))
    get_pcvar_string(g_Cvar[10], szDriver, charsmax(szDriver))

    SQL_SetAffinity(szDriver)
    g_SqlTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szBase)
    new ErrorCode, Handle:SqlConnection = SQL_Connect(g_SqlTuple, ErrorCode, g_Error, charsmax(g_Error))
    if (SqlConnection == Empty_Handle)
        set_fail_state(g_Error)
    new Handle:Queries
    Queries = SQL_PrepareQuery(SqlConnection, "CREATE TABLE IF NOT EXISTS `%s` (steamid varchar(32), skill INT(11))", szTable)
    if (!SQL_Execute(Queries))
    {
        SQL_QueryError(Queries, g_Error, charsmax(g_Error))
        set_fail_state(g_Error)
    }
    SQL_FreeHandle(Queries)
    SQL_FreeHandle(SqlConnection)
}

public Load_MySql(id)
{
    new szSteamId[32], szTemp[512]
    get_user_authid(id, szSteamId, charsmax(szSteamId))
    get_pcvar_string(g_Cvar[9], szTable, charsmax(szTable))
    new Data[1]; Data[0] = id
    format(szTemp, charsmax(szTemp), "SELECT * FROM `%s` WHERE (`%s`. `steamid` = '%s')", szTable, szTable, szSteamId)
    SQL_ThreadQuery(g_SqlTuple, "register_client", szTemp, Data, 1)
}

public register_client(FailState, Handle:Query, Error[], Errcode, Data[], DataSize)
{
    if (FailState == TQUERY_CONNECT_FAILED)
    {
        log_to_file("skill_elo.txt", "Load - Could not connect to SQL database. [%d] %s", Errcode, Error)
    }
    else if (FailState == TQUERY_QUERY_FAILED)
    {
        log_to_file("skill_elo.txt", "Load Query failed. [%d] %s", Errcode, Error)
    }
    new id; id = Data[0]
    if (SQL_NumResults(Query) < 1)
    {
        new szSteamId[32]
        get_user_authid(id, szSteamId, charsmax(szSteamId))
        get_pcvar_string(g_Cvar[9], szTable, charsmax(szTable))
        if (equal(szSteamId, "ID_PENDING"))
            return PLUGIN_HANDLED
        new szTemp[512]
        format(szTemp, charsmax(szTemp), "INSERT INTO `%s` (`steamid`, `skill`) VALUES ('%s', '0')", szTable, szSteamId)
        SQL_ThreadQuery(g_SqlTuple, "IgnoreHandle", szTemp)
        g_user_skill[id][Skill] = float(get_pcvar_num(g_Cvar[1]))
    }
    else
    {
        g_user_skill[id][Skill] = Float:SQL_ReadResult(Query, 1)
    }
    return PLUGIN_HANDLED
}

public Save_MySql(id)
{
    new szSteamId[32], szTemp[512]
    get_user_authid(id, szSteamId, charsmax(szSteamId))
    get_pcvar_string(g_Cvar[9], szTable, charsmax(szTable))
    format(szTemp, charsmax(szTemp), "UPDATE `%s` SET `skill` = '%i' WHERE `%s`.`steamid` = '%s'", szTable, g_user_skill[id][Skill], szTable, szSteamId)
    SQL_ThreadQuery(g_SqlTuple, "IgnoreHandle", szTemp)
}

public IgnoreHandle(FailState, Handle:Query, Error[], Errcode, Data[], DataSize)
{
    SQL_FreeHandle(Query)
    return PLUGIN_HANDLED
}

stock get_skill_id(Float:skill)
{
    for (new i, sk = floatround(skill); i < sizeof g_arrViewSkills; i++)
    {
        if (i && g_arrItemSkills[i] > sk)
            return i - 1
        else if ((!i && g_arrItemSkills[i] > sk) || i == charsmax(g_arrViewSkills))
            return i
    }
    return 0
}

public plugin_natives()
{
    register_library("skill_elo")
    register_native("get_skill_name", "_get_skill_name")
    register_native("get_user_skill", "_get_user_skill", 1)
    register_native("set_user_skill", "_set_user_skill", 1)
}

public Float:_get_user_skill(id)
    return g_user_skill[id][Skill]

public _set_user_skill(id, Float:num)
    g_user_skill[id][Skill] = num

public _get_skill_name(plugin, params)
{
    new id = get_param(1)
    new len = get_param(3)
    new Float:skill, skill_id
    skill = g_user_skill[id][Skill]
    skill_id = get_skill_id(skill)
    new buffer[192]; format(buffer, len, "%L", LANG_SERVER, g_arrViewSkills[skill_id])
    set_string(2, buffer, len)
}
 

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace
где ж тут 100??? 0 в базу пишешь же.
я те так выразился когда заходишь первый раз на сервер то дает скилл 100 выходишь с сервера сохраняет 100 в базу но когда опять заходишь на сервер не загружает 100 а загрузает 0 скилл становится не М 100 а L- 0
 

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace
что никто не поможет?
 

Inline

Пользователь
Регистрация
8 Июн 2017
Сообщения
220
Симпатии
98
Пол
Мужской
Я уже тебе писал в ЛС. Сохраняешь в строке, читаешь число. Вероятнее всего проблема в этом.
 

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace
Я уже тебе писал в ЛС. Сохраняешь в строке, читаешь число. Вероятнее всего проблема в этом.
я же тебе писал что не шарю в этом и код уже другой к тому же) сам глянь) проблема таже но код другой)
 

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace
Я уже тебе писал в ЛС. Сохраняешь в строке, читаешь число. Вероятнее всего проблема в этом.
мне нужно чтобы в базу сохранялось ровное число или дробное 115 или 115.0 и оно же читалось потом! у меня получалось сделать но косячно сохранялось длинное число типа 1113435454 но читалось оно правильно потом но мне так не нужно!
 

Inline

Пользователь
Регистрация
8 Июн 2017
Сообщения
220
Симпатии
98
Пол
Мужской
Анатолий, гуглится за 5 сек. INT нужно в таблице, а не VARCHAR.
 

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace

Inline

Пользователь
Регистрация
8 Июн 2017
Сообщения
220
Симпатии
98
Пол
Мужской
А если точнее, то в столбцах, где числа должны находится.
 

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace

Inline

Пользователь
Регистрация
8 Июн 2017
Сообщения
220
Симпатии
98
Пол
Мужской
Анатолий, Хз даже. Сейчас бы кидать строчку, которая больше похожа на калеку и по ней судить правильно ли всё.
 

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace
Анатолий, Хз даже. Сейчас бы кидать строчку, которая больше похожа на калеку и по ней судить правильно ли всё.
Код:
#include <amxmodx>
#include <sqlx>
#include <skill_elo>

#if AMXX_VERSION_NUM < 183
    #define client_disconnected client_disconnect
#endif

new Handle:g_SqlTuple
new g_Cvar[11], g_Error[512]
new szHost[64], szUser[64], szPass[64], szBase[64], szTable[64], szDriver[10]
new const g_arrItemSkills[] = {0, 60, 75, 85, 100, 115, 130, 140, 150, 165, 180, 195, 210}
new const g_arrViewSkills[][] = {"S_1", "S_2", "S_3", "S_4", "S_5", "S_6", "S_7", "S_8", "S_9", "S_10", "S_11", "S_12", "S_13"}
enum _:SKILL_DATA {KILLS, Float:Skill}
new g_user_skill[33][SKILL_DATA + 1]

public plugin_init()
{
    register_plugin("Skill The ELO Method", "1.0", "AcE")

    g_Cvar[1] = register_cvar("skill_start", "100")
    g_Cvar[2] = register_cvar("skill_need_frags", "100")
    g_Cvar[3] = register_cvar("skill_start_koef", "2.0")
    g_Cvar[4] = register_cvar("skill_next_koef", "1.5")

    g_Cvar[5] = register_cvar("skill_sql_host", "")
    g_Cvar[6] = register_cvar("skill_sql_user", "")
    g_Cvar[7] = register_cvar("skill_sql_pass", "")
    g_Cvar[8] = register_cvar("skill_sql_db", "")
    g_Cvar[9] = register_cvar("skill_sql_table", "")
    g_Cvar[10] = register_cvar("skill_sql_type", "mysql")

    register_event("DeathMsg", "EventDeath", "a", "1>0")
    register_dictionary("skill_elo.txt")
    set_task(1.0, "MySql_Init")
}

public plugin_cfg()
    server_cmd("exec addons/amxmodx/configs/skill_elo.cfg")

public client_putinserver(id) Load_MySql(id)
public client_disconnected(id) Save_MySql(id)
public plugin_end() SQL_FreeHandle(g_SqlTuple)

public EventDeath()
{
    new killer = read_data(1)
    new victim = read_data(2)
    if (killer == victim) return
    new Float:delta = 1.0 / (1.0 + floatpower(10.0, (g_user_skill[killer][Skill] - g_user_skill[victim][Skill]) / 100.0))
    g_user_skill[killer][Skill] += (g_user_skill[killer][KILLS] < get_pcvar_num(g_Cvar[2])) ? (delta * get_pcvar_float(g_Cvar[3])) : (delta * get_pcvar_float(g_Cvar[4]))
    g_user_skill[victim][Skill] -= (g_user_skill[victim][KILLS] < get_pcvar_num(g_Cvar[2])) ? (delta * get_pcvar_float(g_Cvar[3])) : (delta * get_pcvar_float(g_Cvar[4]))
}

public MySql_Init()
{
    get_pcvar_string(g_Cvar[5], szHost, charsmax(szHost))
    get_pcvar_string(g_Cvar[6], szUser, charsmax(szUser))
    get_pcvar_string(g_Cvar[7], szPass, charsmax(szPass))
    get_pcvar_string(g_Cvar[8], szBase, charsmax(szBase))
    get_pcvar_string(g_Cvar[9], szTable, charsmax(szTable))
    get_pcvar_string(g_Cvar[10], szDriver, charsmax(szDriver))

    SQL_SetAffinity(szDriver)
    g_SqlTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szBase)
    new ErrorCode, Handle:SqlConnection = SQL_Connect(g_SqlTuple, ErrorCode, g_Error, charsmax(g_Error))
    if (SqlConnection == Empty_Handle)
        set_fail_state(g_Error)
    new Handle:Queries
    Queries = SQL_PrepareQuery(SqlConnection, "CREATE TABLE IF NOT EXISTS `%s` (`id` int(11) NOT NULL AUTO_INCREMENT, `steam` char(32), `skill` float NOT NULL, PRIMARY KEY (`id`))", szTable)
    if (!SQL_Execute(Queries))
    {
        SQL_QueryError(Queries, g_Error, charsmax(g_Error))
        set_fail_state(g_Error)
    }
    SQL_FreeHandle(Queries)
    SQL_FreeHandle(SqlConnection)
}

public Load_MySql(id)
{
    new szSteamId[32], szTemp[512]
    get_user_authid(id, szSteamId, charsmax(szSteamId))
    get_pcvar_string(g_Cvar[9], szTable, charsmax(szTable))
    new Data[1]; Data[0] = id
    format(szTemp, charsmax(szTemp), "SELECT * FROM `%s` WHERE (`%s`. `steam` = '%s')", szTable, szTable, szSteamId)
    SQL_ThreadQuery(g_SqlTuple, "register_client", szTemp, Data, 1)
}

public register_client(FailState, Handle:Query, Error[], Errcode, Data[], DataSize)
{
    if (FailState == TQUERY_CONNECT_FAILED)
    {
        log_to_file("skill_elo.txt", "Load - Could not connect to SQL database. [%d] %s", Errcode, Error)
    }
    else if (FailState == TQUERY_QUERY_FAILED)
    {
        log_to_file("skill_elo.txt", "Load Query failed. [%d] %s", Errcode, Error)
    }
    new id; id = Data[0]
    if (SQL_NumResults(Query) < 1)
    {
        new szSteamId[32]
        get_user_authid(id, szSteamId, charsmax(szSteamId))
        get_pcvar_string(g_Cvar[9], szTable, charsmax(szTable))
        if (equal(szSteamId, "ID_PENDING"))
            return PLUGIN_HANDLED
        new szTemp[512]
        format(szTemp, charsmax(szTemp), "INSERT INTO `%s` (`steam`, `skill`) VALUES ('%s', '0')", szTable, szSteamId)
        SQL_ThreadQuery(g_SqlTuple, "IgnoreHandle", szTemp)
        g_user_skill[id][Skill] = float(get_pcvar_num(g_Cvar[1]))
    }
    else
    {
        g_user_skill[id][Skill] = Float:SQL_ReadResult(Query, 1)
    }
    return PLUGIN_HANDLED
}

public Save_MySql(id)
{
    new szSteamId[32], szTemp[512]
    get_user_authid(id, szSteamId, charsmax(szSteamId))
    get_pcvar_string(g_Cvar[9], szTable, charsmax(szTable))
    format(szTemp, charsmax(szTemp), "UPDATE `%s` SET `skill` = '%.2f' WHERE `%s`. `steam` = '%s'", szTable, g_user_skill[id][Skill], szTable, szSteamId)
    SQL_ThreadQuery(g_SqlTuple, "IgnoreHandle", szTemp)
}

public IgnoreHandle(FailState, Handle:Query, Error[], Errcode, Data[], DataSize)
{
    SQL_FreeHandle(Query)
    return PLUGIN_HANDLED
}

stock get_skill_id(Float:skill)
{
    for (new i, sk = floatround(skill); i < sizeof g_arrViewSkills; i++)
    {
        if (i && g_arrItemSkills[i] > sk)
            return i - 1
        else if ((!i && g_arrItemSkills[i] > sk) || i == charsmax(g_arrViewSkills))
            return i
    }
    return 0
}

public plugin_natives()
{
    register_library("skill_elo")
    register_native("get_skill_name", "_get_skill_name")
    register_native("get_user_skill", "_get_user_skill", 1)
    register_native("set_user_skill", "_set_user_skill", 1)
}

public Float:_get_user_skill(id)
    return g_user_skill[id][Skill]

public _set_user_skill(id, Float:num)
    g_user_skill[id][Skill] = num

public _get_skill_name(plugin, params)
{
    new id = get_param(1)
    new len = get_param(3)
    new Float:skill, skill_id
    skill = g_user_skill[id][Skill]
    skill_id = get_skill_id(skill)
    new buffer[192]; format(buffer, len, "%L", LANG_SERVER, g_arrViewSkills[skill_id])
    set_string(2, buffer, len)
}
так понятно все? яж говорю я в этом полный ноль еслиб знал не писал бы просто так! вот и прошу помочь
 

Inline

Пользователь
Регистрация
8 Июн 2017
Сообщения
220
Симпатии
98
Пол
Мужской
Анатолий, Я вообще-то по запрос (для создания таблицы), а отправлять один и тот же код дважды бессмысленно.

Тебе нужно самому попробовать и прийти к некоторым логическим выводам.

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

В любом случае, что я говорю это лишь догадки. Мне в ЛС ты кинул структуру таблицы, я понял, что тут скорее всего в этом дело, даже не изучая досконально код.
 

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace
Анатолий, Я вообще-то по запрос (для создания таблицы), а отправлять один и тот же код дважды бессмысленно.

Тебе нужно самому попробовать и прийти к некоторым логическим выводам.

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

В любом случае, что я говорю это лишь догадки. Мне в ЛС ты кинул структуру таблицы, я понял, что тут скорее всего в этом дело, даже не изучая досконально код.
я даже не отдупляю о чем ты) яж говорю еще раз я в mysql не шарю! для меня это пока сложно! зачем бросатся терминами когда проще взять и помочь? если ты в этом понимаешь! я просто даже примеров не нашол чтоб самому сделать.
 

Inline

Пользователь
Регистрация
8 Июн 2017
Сообщения
220
Симпатии
98
Пол
Мужской
Анатолий, Тебе уже помогли, но почти никто за тебя думать или писать код не будет. Можем только направление дать )
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу