Русское сообщество по скриптингу

ArKaNaWorld Money: Данные не отправляются в БД  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение ArKaNeMaN » 20 фев 2017, 17:31

Хмм... ну спасибо... но главная проблема это SQL... Шо в моём коде не так... кроме того что он мой?

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <dhudmessage>
#include <sqlx>
#include <AWM>
#include <mysql>

#define SQL_host "db.ds-host.ru"
#define SQL_user "..."
#define SQL_pass "..."
#define SQL_dbase "..."

new g_Client[] = "!g[!tArKaNaCoins!g]!t";
new Handle:SQL_Tuple
new Handle
:SQL_Connection
new g_syncHudMessage
;
new Money[33]


public plugin_init() {
register_plugin("ArKaNaWorld Money", "0.1", "ArKaNeMaN")
g_syncHudMessage = CreateHudSyncObj();
register_event("DeathMsg", "kill", "a", "1>0")
SQL_Tuple = SQL_MakeDbTuple(SQL_host, SQL_user, SQL_pass, SQL_dbase)
new err, error[256]
SQL_Connection = SQL_Connect(SQL_Tuple, err, error, charsmax(error));
 
if(SQL_Connection == Empty_Handle){
    set_fail_state(error)
}
SQL_FreeHandle(SQL_Connection)
}

public  plugin_natives (){
    register_native("get_money", "native_get_money", 1)
    register_native("spend_money", "native_spend_money", 1)
}

public native_spend_money(price, id){
    if(Money[id] >= price){
        Money[id] -= price;
        print_color_chat(id, "%s !tВы потратили !g%s !tкоинов!", g_Client, price)
        return 1
    
}
    else{
        print_color_chat(id, "!tУ вас !gнедостаточно !tкоинов!", g_Client)
        return 0
    
}
}

public SQLQueryGetMoney(Handle:Query, id){
    SQL_ReadResult(Query, 1, Money[id], 1)
    SQL_FreeHandle(Query)
    return PLUGIN_CONTINUE;
}

public SQLQueryClose(Handle:Query){
    SQL_FreeHandle(Query)
    return PLUGIN_CONTINUE;
}

public native_get_money(id){
    return Money[id]
}

public  client_putinserver(id){
    if(is_user_bot(id)){
        return PLUGIN_HANDLED;
    }
    Money[id] = 0
    new name
[32]
    get_user_name(id, name, 31)
    new szQuery[512]
    formatex(szQuery, charsmax(szQuery), "INSERT INTO `AWM_money` VALUES('%s')", name)
    SQL_ThreadQuery(SQL_Tuple, "SQLQueryClose", szQuery)
    formatex(szQuery, charsmax(szQuery), "SELECT * FROM `AWM_money` WHERE (`AWM_money`.`name` = '%s')", name)
    SQL_ThreadQuery(SQL_Tuple, "SQLQueryGetMoney", szQuery, id)
    
    return PLUGIN_CONTINUE
;
}
public client_disconnect(id){
    if(is_user_bot(id)){
        return PLUGIN_HANDLED;
    }
    new name[32]
    get_user_name(id, name, 31)
    new szQuery[512]
    formatex(szQuery, charsmax(szQuery), "UPDATE `AWM_money` SET `money` = '%s' WHERE `AWM_money`.`name` = '%s'", Money[id], name)
    SQL_ThreadQuery(SQL_Tuple, "SQLQueryClose", szQuery)
    Money[id] = 0
    return PLUGIN_CONTINUE
;
}

public kill(){
    new id = read_data(1)
    new head = read_data(3)
    if(head == 1){
        Money[id] += 2
        print_color_chat
(id, "%s !tВы получили 2 коина за убийство в голову!", g_Client)
    }
    else{
        Money[id]++
        print_color_chat(id, "%s !tВы получили 1 коин за убийство!", g_Client)
    }
}

stock print_color_chat(const index, const input[], any:...) {
        #define gmsg_SayText 76
        static msg[191];
        new count = 1,players[32];
        vformat(msg, 190, input, 3);
        replace_all(msg,sizeof(msg),"!g","^4");
        replace_all(msg,sizeof(msg),"!t","^3");
        replace_all(msg,sizeof(msg),"!n","^1");
        if(index) players[0] = index; else get_players(players,count,"ch");
        for(new i = 0; i < count; i++) {
                if(!is_user_connected(players[i])) return;
                message_begin(MSG_ONE_UNRELIABLE,gmsg_SayText,_,players[i]);
                write_byte(players[i]);
                write_string(msg);
                message_end();
        }
}

public plugin_end(){
    SQL_FreeHandle(SQL_Connection)
}
Последний раз редактировалось ArKaNeMaN 20 фев 2017, 17:36, всего редактировалось 1 раз.
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение NEoMASTERR » 20 фев 2017, 17:36

Код: Выделить всё
SQL_Connection = SQL_Connect(SQL_Tuple, err, error, charsmax(error));

Вот это и всё связанное с SQL_Connection надо удалить, это для синхронных запросов.
(либо работать с ними если надо)

Добавлено спустя 1 минуту 33 секунды:
Код: Выделить всё
public SQLQueryGetMoney(Handle:Queryindsizeof(ind)){
    new 
id ind[2]
    
SQL_ReadResult(Query1Money[id], 1)
    
SQL_FreeHandle(Query)
    return 
PLUGIN_CONTINUE;

Это тоже лучше удалить, в шаблоне функции стоит sizeof, это что то с чем то
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение ArKaNeMaN » 20 фев 2017, 17:38

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <dhudmessage>
#include <sqlx>
#include <AWM>
#include <mysql>

#define SQL_host "db.ds-host.ru"
#define SQL_user "wh_24087_amxbans"
#define SQL_pass "..."
#define SQL_dbase "wh_24087_amxbans"

new g_Client[] = "!g[!tArKaNaCoins!g]!t";
new 
Handle:SQL_Tuple
new g_syncHudMessage;
new 
Money[33]


public 
plugin_init() {
register_plugin("ArKaNaWorld Money""0.1""ArKaNeMaN")
g_syncHudMessage CreateHudSyncObj();
register_event("DeathMsg""kill""a""1>0")
SQL_Tuple SQL_MakeDbTuple(SQL_hostSQL_userSQL_passSQL_dbase)

public  
plugin_natives (){
    
register_native("get_money""native_get_money"1)
    
register_native("spend_money""native_spend_money"1)
}

public 
native_spend_money(priceid){
    if(
Money[id] >= price){
        
Money[id] -= price;
        
print_color_chat(id"%s !tВы потратили !g%s !tкоинов!"g_Clientprice)
        return 
1
    
}
    else{
        
print_color_chat(id"!tУ вас !gнедостаточно !tкоинов!"g_Client)
        return 
0
    
}
}

public 
SQLQueryClose(Handle:Query){
    
SQL_FreeHandle(Query)
    return 
PLUGIN_CONTINUE;
}

public 
native_get_money(id){
    return 
Money[id]
}

public  
client_putinserver(id){
    if(
is_user_bot(id)){
        return 
PLUGIN_HANDLED;
    }
    
Money[id] = 0
    
new name[32]
    
get_user_name(idname31)
    new 
szQuery[512]
    
formatex(szQuerycharsmax(szQuery), "INSERT INTO `AWM_money` VALUES('%s')"name)
    
SQL_ThreadQuery(SQL_Tuple"SQLQueryClose"szQuery)
    
formatex(szQuerycharsmax(szQuery), "SELECT * FROM `AWM_money` WHERE (`AWM_money`.`name` = '%s')"name)
    
SQL_ThreadQuery(SQL_Tuple"SQLQueryGetMoney"szQueryid)
    
    return 
PLUGIN_CONTINUE;
}
public 
client_disconnect(id){
    if(
is_user_bot(id)){
        return 
PLUGIN_HANDLED;
    }
    new 
name[32]
    
get_user_name(idname31)
    new 
szQuery[512]
    
formatex(szQuerycharsmax(szQuery), "UPDATE `AWM_money` SET `money` = '%s' WHERE `AWM_money`.`name` = '%s'"Money[id], name)
    
SQL_ThreadQuery(SQL_Tuple"SQLQueryClose"szQuery)
    
Money[id] = 0
    
return PLUGIN_CONTINUE;
}

public 
kill(){
    new 
id read_data(1)
    new 
head read_data(3)
    if(
head == 1){
        
Money[id] += 2
        print_color_chat
(id"%s !tВы получили 2 коина за убийство в голову!"g_Client)
    }
    else{
        
Money[id]++
        
print_color_chat(id"%s !tВы получили 1 коин за убийство!"g_Client)
    }
}

stock print_color_chat(const index, const input[], any:...) {
        
#define gmsg_SayText 76
        
static msg[191];
        new 
count 1,players[32];
        
vformat(msg190input3);
        
replace_all(msg,sizeof(msg),"!g","^4");
        
replace_all(msg,sizeof(msg),"!t","^3");
        
replace_all(msg,sizeof(msg),"!n","^1");
        if(
indexplayers[0] = index; else get_players(players,count,"ch");
        for(new 
0counti++) {
                if(!
is_user_connected(players[i])) return;
                
message_begin(MSG_ONE_UNRELIABLE,gmsg_SayText,_,players[i]);
                
write_byte(players[i]);
                
write_string(msg);
                
message_end();
        }
}
 


Так?
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение NEoMASTERR » 20 фев 2017, 17:44

Я параллельно переделываю у себя так что сверим в конце
Так правильней:
Код: Выделить всё
public  plugin_natives ()
{
    register_native("money_get", "native_money_get")
    register_native("money_spend", "native_money_spend")
}

//public native_spend_money(price, id)
public native_money_spend(plugin_id, params)
{
    static id; id = get_param(1)
    static count; count = get_param(2)
    if(Money[id] >= count)
    {
        Money[id] -= count;
        print_color_chat(id, "%s !tВы потратили !g%s !tкоинов!", g_Client, count)
        return 1
    
}
    else
    
{
        print_color_chat(id, "%s !tУ вас !gнедостаточно !tкоинов!"g_Client)
        return 0
    
}
}
public native_money_get(plugin_id, params)
{
    return Money[get_param(1)]

Нативы
Код: Выделить всё
native money_spend(id, count)
native money_get(id


Добавлено спустя 2 минуты 41 секунду:
Перед использованием нативов желательно проверять на is_user_connected.
Последний раз редактировалось NEoMASTERR 20 фев 2017, 17:47, всего редактировалось 2 раз(а).
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение ArKaNeMaN » 20 фев 2017, 17:44

Окей
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение NEoMASTERR » 20 фев 2017, 18:46

Код: Выделить всё
#include <hamsandwich>            

Это добавить в инклуды

Добавлено спустя 55 секунд:
поправил native_money_spend, проверьте, там передавался g_Client а это "преффикс" в чате, не обратил внимания, думал там ник игрока

Добавлено спустя 1 минуту 47 секунд:
Код: Выделить всё
    register_event("DeathMsg", "kill", "a", "1>0")
-->
    RegisterHam(Ham_Killed, "player", "ham_killed", 1


Добавлено спустя 7 минут 10 секунд:
Код: Выделить всё
public kill(){
    new id = read_data(1)
    new head = read_data(3)
    if(head == 1){
        Money[id]++
        Money[id]++
        print_color_chat(id, "%s !tВы получили 2 коина за убийство в голову!", g_Client)
    }
    else{
        Money[id]++
        print_color_chat(id, "%s !tВы получили 1 коин за убийство!", g_Client)
    }
}

Меняем на
Код: Выделить всё
public ham_killed(id, pid, shouldgib)
{
    if (is_user_connected(pid))
    {
        static bodyp; bodyp = get_pdata_int( id , m_LastHitGroup, XO_PLAYER);
        if (bodyp == HIT_HEAD)
        {
            Money[id] += 2
            print_color_chat
(id, "%s !tВы получили 2 коина за убийство в голову!", g_Client)
        }
        else
        
{
            Money[id] += 1
            print_color_chat
(id, "%s !tВы получили 1 коин за убийство!", g_Client)
        }
    }
    return HAM_IGNORED
}


Добавлено спустя 48 секунд:
Удаляем
Код: Выделить всё

public plugin_end
(){
    SQL_FreeHandle(SQL_Tuple)

Добавляем после дефайнов в самом начале скрипта
Код: Выделить всё
const XO_PLAYER         = 5
const m_LastHitGroup     
= 75


Добавлено спустя 4 минуты 57 секунд:
Код: Выделить всё
#include <fakemeta>      


Добавлено спустя 17 минут 31 секунду:
Код: Выделить всё
public client_putinserver(id)
{
    if(is_user_bot(id))
    {
        return PLUGIN_HANDLED;
    }
    Money[id] = 0
    new name
[32]
    get_user_name(id, name, 31)
    new ind[33]
    ind[2] = id
    new szQuery
[512]
    formatex(szQuery, charsmax(szQuery), "INSERT INTO `AWM_money` VALUES('%s')", name)
    SQL_ThreadQuery(SQL_Tuple, "SQLQueryClose", szQuery)
    formatex(szQuery, charsmax(szQuery), "SELECT * FROM `AWM_money` WHERE (`AWM_money`.`name` = '%s')", name)
    SQL_ThreadQuery(SQL_Tuple, "SQLQueryGetMoney", szQuery, ind, sizeof(ind))
    set_task(1.0,"HUDMoney",id+11585, _,_,"b")
    
    return PLUGIN_CONTINUE
;

Заменяем на
Код: Выделить всё
public client_authorized(id)
{
    if(is_user_bot(id)) return PLUGIN_HANDLED;
    static name[64], qname[charsmax(name)*2]
    get_user_name(id, name, charsmax(name))
    
    SQL_QuoteString
(Empty_Handle, qname, charsmax(qname), name)    
    
    static data
[sql_data];
    data[sql_t] = SQL_GET_MONEY;
    data[sql_id] = id;
    data[sql_userid] = get_user_userid(id)
    
    static query
[255]; formatex(query, charsmax(query), "SELECT `money` FROM `AWM_money` WHERE (`name` = '%s') LIMIT 1;", qname)
    SQL_ThreadQuery(SQL_Tuple, "sql_handler", query, data, sql_data)
    
    return PLUGIN_CONTINUE


Добавлено спустя 24 минуты 3 секунды:
Это
Код: Выделить всё
public client_disconnect(id)
{
    if(is_user_bot(id)) return PLUGIN_HANDLED;
    new name[32]
    get_user_name(id, name, 31)
    new money = Money[id]
    new szQuery[512]
    formatex(szQuery, charsmax(szQuery), "UPDATE `AWM_money` SET `money` = '%s' WHERE `AWM_money`.`name` = '%s'", money, name)
    SQL_ThreadQuery(SQL_Tuple, "SQLQueryClose", szQuery)
    Money[id] = 0
    return PLUGIN_CONTINUE
;
}

Заменяем на
Код: Выделить всё
#if AMXX_VERSION_NUM < 183
public client_disconnect(id)
#else
public client_disconnected(id)
#endif
{
    if(is_user_bot(id)) return PLUGIN_HANDLED;
    static name[64], qname[charsmax(name)*2]
    get_user_name(id, name, charsmax(name))
    
    SQL_QuoteString
(Empty_Handle, qname, charsmax(qname), name)    
    
    static data
[sql_data];
    data[sql_t] = SQL_ADD_MONEY;
    data[sql_id] = id;
    data[sql_userid] = get_user_userid(id)
    data[sql_money] = Money[id]
    
    static query
[255]; formatex(query, charsmax(query), "INSERT INTO `AWM_money` (`name`,`money`) VALUES ('%s', %d) ON DUPLICATE KEY UPDATE `money`=`money`+VALUE(`money`)", qname, Money[id] - g_MoneyOld[id])
    SQL_ThreadQuery(SQL_Tuple, "sql_handler", query, data, sql_data)
    
    return PLUGIN_CONTINUE
}


Добавлено спустя 1 минуту 11 секунд:
Добавляем переменную
Код: Выделить всё
new g_MoneyOld[MAX_PLAYERS+1

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

Добавлено спустя 1 минуту:
Ну и самое важное, добавляем
Код: Выделить всё
public sql_handler(failstate, Handle:h, error[], errnum, data[], size, Float:queuetime)
{
    if(failstate == TQUERY_SUCCESS)
    {
        static id; id = data[sql_id]
        static userid; userid = data[sql_userid]
        switch (data[sql_t])
        {
            case SQL_GET_MONEY:
            {
                if (get_user_userid(id) == userid)  // если игрок не вышел после запроса
                {
                    if (SQL_MoreResults(h)) 
                    
{
                        static m; m = SQL_ReadResult(h, 0)
                        Money[id] = m
                        g_MoneyOld
[id] = m
                    
}
                }
            }
            case SQL_SET_MONEY:
            {
                // можно прикрутить
            }
            case SQL_ADD_MONEY:
            {
                if (get_user_userid(id) == userid)  // если игрок не вышел после запроса
                {
                    if (SQL_AffectedRows(h)) 
                    
{
                        g_MoneyOld[id] = data[sql_money]
                    }
                }
            }
        }
    }
    else log_amx("sql error: %d (%s)", errnum, error)
}


Добавлено спустя 1 минуту 19 секунд:
Так же можно сохранять монетки после смерти потому что AMXX 1.8.2 иногда не обрабатывает выход игрока с сервера
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение ArKaNeMaN » 20 фев 2017, 18:47

Всё?
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: ArKaNaWorld Money: Данные не отправляются в БД  [Решено]

Сообщение NEoMASTERR » 20 фев 2017, 18:54

Это удаляем вместе с тасками, обновлять худ будем при изменении кол.ва монеток (рациональнее)
Код: Выделить всё
public HUDMoney(id)
{
    id -= 11585
    set_hudmessage
(255, 255, 255, 0.0, 0.23, 0, 6.0, 999.0, 1.0, 999.0, -1);
    ShowSyncHudMsg(id, g_syncHudMessage, "Коины: %s", Money[id]);


Добавлено спустя 45 секунд:
Добавим это
Код: Выделить всё

register_event
("ResetHUD", "event_hud", "b") // в plugin_init

public event_hud(id)
{
    refresh_hud(id)
}

public refresh_hud(id)
{
    set_hudmessage(255, 255, 255, 0.0, 0.23, 0, 6.0, 999.0, 1.0, 999.0, -1);
    ShowSyncHudMsg(id, g_syncHudMessage, "Коины: %s", Money[id]);


Добавлено спустя 46 секунд:
Добавим refresh_hud в ham_killed (нашёл косяк так что функцию можно заменить на новую)
Код: Выделить всё
public ham_killed(id, pid, shouldgib)
{
    if (is_user_connected(pid))
    {
        static bodyp; bodyp = get_pdata_int( id , m_LastHitGroup, XO_PLAYER);
        if (bodyp == HIT_HEAD)
        {
            Money[pid] += 2
            print_color_chat
(pid, "%s !tВы получили 2 коина за убийство в голову!", g_Client)
        }
        else
        
{
            Money[pid] += 1
            print_color_chat
(pid, "%s !tВы получили 1 коин за убийство!", g_Client)
        }
        refresh_hud(pid)
    }
    return HAM_IGNORED
}


Добавлено спустя 44 секунды:
Проверить сейчас негде, полный исходник
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <dhudmessage>
#include <sqlx>
#include <hamsandwich>
#include <fakemeta>

#if !defined MAX_PLAYERS
    #define MAX_PLAYERS 32
#endif

#define SQL_host "db.ds-host.ru"
#define SQL_user "..."
#define SQL_pass "..."
#define SQL_dbase "..."

enum sql_type
{
    SQL_GET_MONEY,
    SQL_SET_MONEY,
    SQL_ADD_MONEY
}

enum sql_data
{
    sql_t,
    sql_id,
    sql_userid,
    sql_money
}

const XO_PLAYER         = 5
const m_LastHitGroup     
= 75

new g_Client
[] = "!g[!tArKaNaCoins!g]!t";
new Handle:SQL_Tuple
new g_syncHudMessage
;
new Money[MAX_PLAYERS+1]
new g_MoneyOld[MAX_PLAYERS+1]

native money_spend(id, count)
native money_get(id)

public plugin_init() 
{
    register_plugin("ArKaNaWorld Money", "0.1", "ArKaNeMaN")
    register_event("ResetHUD", "event_hud", "b")
    g_syncHudMessage = CreateHudSyncObj();
    RegisterHam(Ham_Killed, "player", "ham_killed", 1)
    SQL_Tuple = SQL_MakeDbTuple(SQL_host, SQL_user, SQL_pass, SQL_dbase)
}

public  plugin_natives ()
{
    register_native("money_get", "native_money_get")
    register_native("money_spend", "native_money_spend")
}

public sql_handler(failstate, Handle:h, error[], errnum, data[], size, Float:queuetime)
{
    if(failstate == TQUERY_SUCCESS)
    {
        static id; id = data[sql_id]
        static userid; userid = data[sql_userid]
        switch (data[sql_t])
        {
            case SQL_GET_MONEY:
            {
                if (get_user_userid(id) == userid)  // если игрок не вышел после запроса
                {
                    if (SQL_MoreResults(h)) 
                    
{
                        static m; m = SQL_ReadResult(h, 0)
                        Money[id] = m
                        g_MoneyOld
[id] = m
                    
}
                }
            }
            case SQL_SET_MONEY:
            {
                // можно прикрутить
            }
            case SQL_ADD_MONEY:
            {
                if (get_user_userid(id) == userid)  // если игрок не вышел после запроса
                {
                    if (SQL_AffectedRows(h)) 
                    
{
                        g_MoneyOld[id] = data[sql_money]
                    }
                }
            }
        }
    }
    else log_amx("sql error: %d (%s)", errnum, error)
}

public native_money_spend(plugin_id, params)
{
    static id; id = get_param(1)
    static count; count = get_param(2)
    if(Money[id] >= count)
    {
        Money[id] -= count;
        print_color_chat(id, "%s !tВы потратили !g%s !tкоинов!", g_Client, count)
        return 1
    
}
    
    print_color_chat
(id, "%s !tУ вас !gнедостаточно !tкоинов!", g_Client)
    return 0
}

public native_money_get(plugin_id, params)
{
    return Money[get_param(1)]
}

public client_authorized(id)
{
    if(is_user_bot(id)) return PLUGIN_HANDLED;
    static name[64], qname[charsmax(name)*2]
    get_user_name(id, name, charsmax(name))
    
    SQL_QuoteString
(Empty_Handle, qname, charsmax(qname), name)    
    
    static data
[sql_data];
    data[sql_t] = SQL_GET_MONEY;
    data[sql_id] = id;
    data[sql_userid] = get_user_userid(id)
    
    static query
[255]; formatex(query, charsmax(query), "SELECT `money` FROM `AWM_money` WHERE (`name`= '%s') LIMIT 1;", qname)
    SQL_ThreadQuery(SQL_Tuple, "sql_handler", query, data, sql_data)
    
    return PLUGIN_CONTINUE
}

#if AMXX_VERSION_NUM < 183
public client_disconnect(id)
#else
public client_disconnected(id)
#endif
{
    if(is_user_bot(id)) return PLUGIN_HANDLED;
    static name[64], qname[charsmax(name)*2]
    get_user_name(id, name, charsmax(name))
    
    SQL_QuoteString
(Empty_Handle, qname, charsmax(qname), name)    
    
    static data
[sql_data];
    data[sql_t] = SQL_ADD_MONEY;
    data[sql_id] = id;
    data[sql_userid] = get_user_userid(id)
    data[sql_money] = Money[id]
    
    static query
[255]; formatex(query, charsmax(query), "INSERT INTO `AWM_money` (`name`,`money`) VALUES ('%s', %d) ON DUPLICATE KEY UPDATE `money`=`money`+VALUE(`money`)", qname, Money[id] - g_MoneyOld[id])
    SQL_ThreadQuery(SQL_Tuple, "sql_handler", query, data, sql_data)
    
    return PLUGIN_CONTINUE
}

public ham_killed(id, pid, shouldgib)
{
    if (is_user_connected(pid))
    {
        static bodyp; bodyp = get_pdata_int( id , m_LastHitGroup, XO_PLAYER);
        if (bodyp == HIT_HEAD)
        {
            Money[pid] += 2
            print_color_chat
(pid, "%s !tВы получили 2 коина за убийство в голову!", g_Client)
        }
        else
        
{
            Money[pid] += 1
            print_color_chat
(pid, "%s !tВы получили 1 коин за убийство!", g_Client)
        }
        refresh_hud(pid)
    }
    return HAM_IGNORED
}

public event_hud(id)
{
    refresh_hud(id)
}

public refresh_hud(id)
{
    set_hudmessage(255, 255, 255, 0.0, 0.23, 0, 6.0, 999.0, 1.0, 999.0, -1);
    ShowSyncHudMsg(id, g_syncHudMessage, "Коины: %s", Money[id]);
}

stock print_color_chat(const index, const input[], any:...) {
        #define gmsg_SayText 76
        static msg[191];
        new count = 1,players[32];
        vformat(msg, 190, input, 3);
        replace_all(msg,sizeof(msg),"!g","^4");
        replace_all(msg,sizeof(msg),"!t","^3");
        replace_all(msg,sizeof(msg),"!n","^1");
        if(index) players[0] = index; else get_players(players,count,"ch");
        for(new i = 0; i < count; i++) {
                if(!is_user_connected(players[i])) return;
                message_begin(MSG_ONE_UNRELIABLE,gmsg_SayText,_,players[i]);
                write_byte(players[i]);
                write_string(msg);
                message_end();
        }
}
 


Добавлено спустя 1 минуту 6 секунд:
Теперь вроде всё.

Есть некоторые мелочи которые можно доработать, например привязка по нику = ниоч.
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение ArKaNeMaN » 20 фев 2017, 19:02

А по STEAMID если... то он же может меняться?.... разными способами....
Такс... сойдёт если твой исходник скопирую?... а то у меня немног по другому

Добавлено спустя 4 минуты 33 секунды:
И ещё кое что... HUD будет не тут выводиться... в другом большом плагине... ты вроде его видел... что бы лишними hud-ами не засирать сервер
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: ArKaNaWorld Money: Данные не отправляются в БД

Сообщение NEoMASTERR » 20 фев 2017, 19:05

Стим может меняться, при должной настройке dproto (reunion) подмену очень сложно совершить. Ник всё же проще поменять). А на счёт протекторов то можно выучить фразу "нехрен идчейнджер включать тогда и монетки будут сохраняться"
Копируй.

Добавлено спустя 1 минуту 56 секунд:
Ну с худом я показал принцип. Можно его не на таске держать а на его опции "время на экране" (999 сек в скрипте), обновлять данные лучше по изменению переменной, если там не флуд конечно (при убийстве = норм, в client_PreThink плохо)
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Пред.След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4