Question

не работает такая штука,вообщем я сделал кмд которая проверяет ник игрока в бд в таблице с машинами,если найден столбец с таким ником,то спавним его тачку но:

CMD:fix(playerid,vehicleid)
{
    new query[120];
    format(query,sizeof(query),"SELECT * FROM `user_veh` WHERE `owner` = '%s'",Player[playerid][nick]);
    mysql_function_query(mysql,query,true,"check","ii",playerid,vehicleid);
    SendClientMessage(playerid, -1"true");
}
forward check(playerid,vehicleid);
public check(playerid,vehicleid)
{
    new rows,fields;
    cache_get_data(rows,fields);
    if(rows)
    {
        SendClientMessage(playerid,-1,"ssssqwe1254");
        AddStaticVehicle(vInfo[vehicleid][vModel],vInfo[vehicleid][x],vInfo[vehicleid][y],vInfo[vehicleid][z],0.0,vInfo[vehicleid][vColor1],vInfo[vehicleid][vColor2]);
    }
    else print("тест");
}
public OnGameModeInit()
{
    loadveh();
    return 1;
}
stock loadveh()
{
    mysql_query(mysql,"SELECT * FROM `user_veh`");
    new f = cache_get_row_count(mysql);
    for(new i; i < f; i++)
    {
        vInfo[i][vID] = cache_get_field_content_int(0,"vID",mysql);
        vInfo[i][vModel] = cache_get_field_content_int(0"vModel", mysql);
        vInfo[i][owner] = cache_get_field_content(0,"owner", Player[i][nick], mysql);
        vInfo[i][x] = cache_get_field_content_float(0,"x",mysql);
        vInfo[i][y] = cache_get_field_content_float(0,"y",mysql);
        vInfo[i][z] = cache_get_field_content_float(0,"z",mysql);
        vInfo[i][vColor2] = cache_get_field_content_int(0,"vColor1",mysql);
        vInfo[i][vColor2] = cache_get_field_content_int(0,"vColor2",mysql);
    }
}
public OnGameModeExit()
{
    mysql_close(mysql);
    clear(playerid);
    return 1;
}
stock clear()
{   
    new f = cache_get_row_count(mysql);
    for(new i; i < f; i++)
    {
        vInfo[i][vID] = 0;
        vInfo[i][vModel] = 0;
        vInfo[i][owner] = EOS;
        vInfo[i][x] = 0.0;
        vInfo[i][y] = 0.0;
        vInfo[i][z] = 0.0;
        vInfo[i][vColor2] = 0;
        vInfo[i][vColor2] = 0;
    }
}

если я пишу AddStaticVehicle(vInfo[vehicleid][vModel],vInfo[vehicleid][x],vInfo[vehicleid][y],vInfo[vehicleid][z],0.0,vInfo[vehicleid][vColor1],vInfo[vehicleid][vColor2]);

 

То машину не спавнит, а если AddStaticVehicle(любой ид модели, 0.0,0.0,2.0,0.0,3,0); то спавнит

Share this post


Link to post

27 answers to this question

  • 1

@DEST вывелось

@DEST в логах есть,а в игре машины нет,

Цитата

enum veh{
vID,
owner[24],
vModel,
vColor1,
vColor2,
Float:x,
Float:y,
Float:z
};

 

 

Share this post


Link to post
  • 1

@glvde. [

Спойлер

18:28:46] Number of vehicle models: 0
[18:29:21] [connection] 25.49.48.2:56574 requests connection cookie.
[18:29:22] [connection] incoming connection: 25.49.48.2:56574 id: 0
[18:29:22] [join] Derk has joined the server (0:25.49.48.2)
[18:29:57] [Pawn.CMD] HandleCommand: AMX error occurred in public pc_cmd_fix: Array index out of bounds
[18:29:59] [Pawn.CMD] HandleCommand: AMX error occurred in public OnPlayerCommandText: Array index out of bounds
[18:29:59] [Pawn.CMD] HandleCommand: AMX error occurred in public OnPlayerCommandText: Array index out of bounds

 

Share this post


Link to post
  • 1

@glvde. 

@Sleash`en Все работает только так:

forward loadveh();
public loadveh()
{
    new s[2];
    cache_get_data(s[0],s[1]);
    for(new i; i < s[0]; i++)
    {
        vInfo[i][vID] = cache_get_field_content_int(0,"vID",mysql);
        vInfo[i][vModel] = cache_get_field_content_int(0"vModel", mysql);
        vInfo[i][owner] = cache_get_field_content(0,"owner", Player[i][nick], mysql);
        vInfo[i][x] = cache_get_field_content_float(0,"x",mysql);
        vInfo[i][y] = cache_get_field_content_float(0,"y",mysql);
        vInfo[i][z] = cache_get_field_content_float(0,"z",mysql);
        vInfo[i][vColor2] = cache_get_field_content_int(0,"vColor1",mysql);
        vInfo[i][vColor2] = cache_get_field_content_int(0,"vColor2",mysql);
        AddStaticVehicle(vInfo[i][vModel], vInfo[i][x], vInfo[i][y], vInfo[i][z], 0.0, vInfo[i][vColor1], vInfo[i][vColor2]);
    }
}
CMD:fx(){ 
    new query[104];
    format(query,sizeof(query),"SELECT * FROM `user_veh`");
    mysql_function_query(mysql,query,true,"loadveh","");

public OnGameModeInit()
{
    mysql = mysql_connect(host,user,bd,sqlpass);
    CheckConnectSQL();
    new query[104];
    format(query,sizeof(query),"SELECT * FROM `user_veh`");
    mysql_function_query(mysql,query,true,"loadveh","");
    return 1;
}

 

Share this post


Link to post
  • 0
AddStaticVehicle(vInfo[vehicleid][vModel],0.0,0.0,2.0,0.0,vInfo[vehicleid][vColor1],vInfo[vehicleid][vColor2]);

попробуй так

Share this post


Link to post
  • 0

@Mishunin пытался еще раньше, не выходит

Share this post


Link to post
  • 0

@Antoxa39 ты создаешь машину, или спавнишь ее?

Share this post


Link to post
  • 0

@Mishunin AddStaticVehicle создает машину и спавнит ее

Share this post


Link to post
  • 0

@Antoxa39 ошибаешься, AddStaticVehicle - Создает.

вставь это:

SetVehicleToRespawn(vInfo[vehicleid][vModel]);

вместо этого:

AddStaticVehicle(vInfo[vehicleid][vModel],vInfo[vehicleid][x],vInfo[vehicleid][y],vInfo[vehicleid][z],0.0,vInfo[vehicleid][vColor1],vInfo[vehicleid][vColor2]);

 

Share this post


Link to post
  • 0

@Mishunin а как он коорд сделает нужные мне?

Share this post


Link to post
  • 0

@Mishunin не не помогло

Share this post


Link to post
  • 0
1 час назад, Antoxa39 сказал:

CMD:fix(playerid,vehicleid)

здесь точно принимается корректный vehicleid? Там вроде params[] должен быть. Что-то типа этого попробуйте: 

CMD:fix(playerid, params[])
{
    new vehicleid;
    if (sscanf(params, "i", vehicleid)) return SendClientMessage(playerid, -1"USAGE: /fix [vehicleid]");
    /*продолжение команды из старт поста*/
}

 

Share this post


Link to post
  • 0

Да, типо того. Только попробуйте еще для отладки вывести vehid в консоль/чат@Antoxa39 

Share this post


Link to post
  • 0

@DEST сделал так:https://imgur.com/a/IspIBsg .

 

 

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

 

то есть /fix 0 1

Share this post


Link to post
  • 0

@Antoxa39 И даже "true" в чат не выводится? 

И да, зачем еще раз нужно перезаписывать playerid? Он автоматически приходит того игрока, который ввел команду, в первом аргументе. 

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

Share this post


Link to post
  • 0

@Antoxa39 а в логи сервера что вывелось? После слов "да да"?

Share this post


Link to post
  • 0

А зачем нужен параметр vehicleid в команде? Это номер личного авто игрока? Т.е. он может иметь несколько машин, и здесь выбирает порядковый номер?

Share this post


Link to post
  • 0

Если найдется строка, то паблик выдаст лог в консоль. Сделал вывод координат, на которые спавнится Т/С, и не только.
Немного переписал функцию проверки.

 

Спойлер

CMD:fix(playerid, params[]) {
    new query[120];
    if(sscanf(params, "ud", params[0], params[1])) 
        return SendClientMessage(playerid, -1"Используйте: /fix [playerid] [vehid]");

    format(query, sizeof(query), "SELECT * FROM `user_veh` WHERE `owner` = '%s'", Player[params[0]][nick]);
    mysql_function_query(mysql, query, true"check""ii", params[0], params[1]);
    SendClientMessage(params[0], -1"true");
    return 1;
}

forward check(playerid, vehicleid);
public check(playerid, vehicleid) {
    new rows, fields;
    cache_get_data(rows, fields);

    if(rows) {
        for(new i; i < rows; i++) {
            vInfo[i][vModel] = cache_get_field_content_int(0"vModel", mysql);
            if(vInfo[i][vModel] != vehicleid) {
                vInfo[i][vModel] = 0;
                continue;
            }

            vInfo[i][vID] = cache_get_field_content_int(0"vID", mysql);
            vInfo[i][owner] = cache_get_field_content(0"owner", Player[i][nick], mysql);
            vInfo[i][x] = cache_get_field_content_float(0"x", mysql);
            vInfo[i][y] = cache_get_field_content_float(0"y", mysql);
            vInfo[i][z] = cache_get_field_content_float(0"z", mysql);
            vInfo[i][vColor2] = cache_get_field_content_int(0"vColor1", mysql);
            vInfo[i][vColor2] = cache_get_field_content_int(0"vColor2", mysql);

            AddStaticVehicle(vInfo[i][vModel], vInfo[i][x], vInfo[i][y], vInfo[i][z], 0.0, vInfo[i][vColor1], vInfo[i][vColor2]);
            printf("[public check]: vModel: %d; x: %2.f; y: %2.f; z: %2.f; vColor1: %d; vColor2: %d;", vInfo[i][vModel], vInfo[i][x], vInfo[i][y], vInfo[i][z], vInfo[i][vColor1], vInfo[i][vColor2]);
        }
    }
    else return print("[public check]: not found;");
    return 1;
}

 

 

Edited by glvde.

Share this post


Link to post
  • 0

new query[120];
mysql_function_query(mysql,query,true,"loadveh","");

Этот список действий должен помочь:

I. В OnGameModeInit вместо вызова стока, впишите запрос в БД через паблик:

new query[120];
mysql_function_query(mysql,query,true,"loadveh","");

II. Уберите stock с loadveh и объявите его как паблик (не забудьте про forward)

III. Уберите в loadveh следующую строчку:

mysql_query(mysql,"SELECT * FROM `user_veh`");

Ах да, лучше в loadveh сделать такой цикл:

 new rows,fields;
cache_get_data(rows,fields);
for(int i; i < rows; i++)
{
    //...
}
// P.S. не помню в объявлении должно быть < или <=, проверьте, будет ли спавниться последняя машина

 

Edited by Sleash`en

Share this post


Link to post
  • 0

@Sleash`en но есть баг,что если допустим в бд 2 машины, у них разные модели, допустим одна 402, другая 415 ид, и владельцы разные при включении серва спавнятся 2 машины, то только 402 ид

Share this post


Link to post
  • 0

@Antoxa39 Спавн авто у вас в паблике check, но туда код приходит от команды fx/fix, а вы там sscanf не прописали

Да-да, sscanf нужен не только для проверки того, написал ли игрок данные, но и присвоевает эти данные к переменным

Share this post


Link to post
  • 0

@Antoxa39 Спавн авто у вас в паблике check, но туда код приходит от команды fx/fix, а вы там sscanf не прописали

Да-да, sscanf нужен не только для проверки того, написал ли игрок данные, но и присвоевает эти данные к переменным

Share this post


Link to post
  • 0

@Sleash`en я не прописывал кмд /fix,а только /fx

Share this post


Link to post
Guest
This topic is now closed to further replies.