help with sscanf splitting into a enum
#1

Hey with my house system I have it so a callback called OnHouseLoaded in this callback it should split the data into a enumerator which is stored in the variable: PlayerInfo. However I am not sure it is working as my text label is not being created which leads me to believe it is not storing the data for the X, Y and the Z co-ordinate.

Here is the code I am using:
pawn Код:
public OnHouseLoaded(playerid)
{
    new
        idx,
        result[256];
    mysql_store_result();
    while(mysql_fetch_row_format(result, "|"))
    {
        sscanf(result, "e<is[30]iifffiis[200]>", HouseInfo[idx]);
        new houselabel[200];
        format(houselabel, sizeof(houselabel), "House ID: %i\nHouse Owner: %s\nHouse Price: $%i\nHouseLevel: %i\nUse /buy to buy this house!", HouseInfo[idx][houseid], HouseInfo[idx][howner], HouseInfo[idx][hprice], HouseInfo[idx][hlevel]);
        HouseInfo[idx][hlabel] = Create3DTextLabel(houselabel, COLOR_LIGHTGREEN, HouseInfo[idx][HouseX], HouseInfo[idx][HouseY], HouseInfo[idx][HouseZ], 40.0, 0, 0);
        new string[200], name[MAX_PLAYER_NAME];
        GetPlayerName(playerid, name, sizeof(name));
        format(string, sizeof(string), "Admin: %s has created a new house with the ID: %i", name, HouseInfo[idx][houseid]);
        SendAdminMessage(COLOR_GOLD, string);
        idx++;
    }
    mysql_free_result();
    printf("MySQL: Succesful. Fetched %i rows from the database.", idx+1);
    return 1;
}
Reply
#2

Quote:
Originally Posted by ******
Посмотреть сообщение
Have you tried adding prints to the code to see what various bits of data hold? And if so what do they say?
at the time of writing this the message that needs to be sent is being sent 3 times, (Obviously for all 3 houses in the DB) and I know why that is, the problem is they all ID 0 : S
Reply
#3

Quote:
Originally Posted by ******
Посмотреть сообщение
That's not what I said.
Well surely I would not need to as the purpose of the print would be to output the data to test if it is being split however I have tested the data in the message that is being sent
Reply
#4

I tried it with all the data and with no luck this is with the price, it should be 999 however it is zero:
pawn Код:
[16:25:04] A house with the cost: 0 has been loaded. //Before
[16:25:04] A house with the cost: 0 has been loaded. //After
Here is the code:
pawn Код:
public OnHouseLoaded(playerid)
{
    new
        idx,
        result[256];
    mysql_store_result();
    while(mysql_fetch_row_format(result, "|"))
    {
        new string[256];
        format(string, sizeof(string), "A house with the cost: %i has been loaded.", HouseInfo[idx][hprice]);
        printf(string);
        sscanf(result, "p<|>e<is[30]iifffiis[200]>", HouseInfo[idx]);
        new houselabel[200];
        format(houselabel, sizeof(houselabel), "House ID: %i\nHouse Owner: %s\nHouse Price: $%i\nHouseLevel: %i\nUse /buy to buy this house!", HouseInfo[idx][houseid], HouseInfo[idx][howner], HouseInfo[idx][hprice], HouseInfo[idx][hlevel]);
        format(string, sizeof(string), "A house with the cost: %i has been loaded.", HouseInfo[idx][hprice]);
        printf(string);
        idx++;
    }
    mysql_free_result();
    printf("MySQL: Succesful. Fetched %i rows from the database.", idx+1);
    return 1;
}
Reply
#5

Could it be anything to do with my sscanf stock?:
pawn Код:
stock sscanf(string[], format[], {Float,_}:...)
{
    #if defined isnull
        if (isnull(string))
    #else
        if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
        {
            return format[0];
        }
    #pragma tabsize 4
    new
        formatPos = 0,
        stringPos = 0,
        paramPos = 2,
        paramCount = numargs(),
        delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
        stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
        switch (format[formatPos++])
        {
            case '\0':
            {
                return 0;
            }
            case 'i', 'd':
            {
                new
                    neg = 1,
                    num = 0,
                    ch = string[stringPos];
                if (ch == '-')
                {
                    neg = -1;
                    ch = string[++stringPos];
                }
                do
                {
                    stringPos++;
                    if ('0' <= ch <= '9')
                    {
                        num = (num * 10) + (ch - '0');
                    }
                    else
                    {
                        return -1;
                    }
                }
                while ((ch = string[stringPos]) > ' ' && ch != delim);
                setarg(paramPos, 0, num * neg);
            }
            case 'h', 'x':
            {
                new
                    num = 0,
                    ch = string[stringPos];
                do
                {
                    stringPos++;
                    switch (ch)
                    {
                        case 'x', 'X':
                        {
                            num = 0;
                            continue;
                        }
                        case '0' .. '9':
                        {
                            num = (num << 4) | (ch - '0');
                        }
                        case 'a' .. 'f':
                        {
                            num = (num << 4) | (ch - ('a' - 10));
                        }
                        case 'A' .. 'F':
                        {
                            num = (num << 4) | (ch - ('A' - 10));
                        }
                        default:
                        {
                            return -1;
                        }
                    }
                }
                while ((ch = string[stringPos]) > ' ' && ch != delim);
                setarg(paramPos, 0, num);
            }
            case 'c':
            {
                setarg(paramPos, 0, string[stringPos++]);
            }
            case 'f':
            {

                new changestr[16], changepos = 0, strpos = stringPos;
                while(changepos < 16 && string[strpos] && string[strpos] != delim)
                {
                    changestr[changepos++] = string[strpos++];
                    }
                changestr[changepos] = '\0';
                setarg(paramPos,0,_:floatstr(changestr));
            }
            case 'p':
            {
                delim = format[formatPos++];
                continue;
            }
            case '\'':
            {
                new
                    end = formatPos - 1,
                    ch;
                while ((ch = format[++end]) && ch != '\'') {}
                if (!ch)
                {
                    return -1;
                }
                format[end] = '\0';
                if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
                {
                    if (format[end + 1])
                    {
                        return -1;
                    }
                    return 0;
                }
                format[end] = '\'';
                stringPos = ch + (end - formatPos);
                formatPos = end + 1;
            }
            case 'u':
            {
                new
                    end = stringPos - 1,
                    id = 0,
                    bool:num = true,
                    ch;
                while ((ch = string[++end]) && ch != delim)
                {
                    if (num)
                    {
                        if ('0' <= ch <= '9')
                        {
                            id = (id * 10) + (ch - '0');
                        }
                        else
                        {
                            num = false;
                        }
                    }
                }
                if (num && IsPlayerConnected(id))
                {
                    setarg(paramPos, 0, id);
                }
                else
                {
                    #if !defined foreach
                        #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
                        #define __SSCANF_FOREACH__
                    #endif
                    string[end] = '\0';
                    num = false;
                    new
                        name[MAX_PLAYER_NAME];
                    id = end - stringPos;
                    foreach (Player, playerid)
                    {
                        GetPlayerName(playerid, name, sizeof (name));
                        if (!strcmp(name, string[stringPos], true, id))
                        {
                            setarg(paramPos, 0, playerid);
                            num = true;
                            break;
                        }
                    }
                    if (!num)
                    {
                        setarg(paramPos, 0, INVALID_PLAYER_ID);
                    }
                    string[end] = ch;
                    #if defined __SSCANF_FOREACH__
                        #undef foreach
                        #undef __SSCANF_FOREACH__
                    #endif
                }
                stringPos = end;
            }
            case 's', 'z':
            {
                new
                    i = 0,
                    ch;
                if (format[formatPos])
                {
                    while ((ch = string[stringPos++]) && ch != delim)
                    {
                        setarg(paramPos, i++, ch);
                    }
                    if (!i)
                    {
                        return -1;
                    }
                }
                else
                {
                    while ((ch = string[stringPos++]))
                    {
                        setarg(paramPos, i++, ch);
                    }
                }
                stringPos--;
                setarg(paramPos, i, '\0');
            }
            default:
            {
                continue;
            }
        }
        while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
        {
            stringPos++;
        }
        while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
        {
            stringPos++;
        }
        paramPos++;
    }
    do
    {
        if ((delim = format[formatPos++]) > ' ')
        {
            if (delim == '\'')
            {
                while ((delim = format[formatPos++]) && delim != '\'') {}
            }
            else if (delim != 'z')
            {
                return delim;
            }
        }
    }
    while (delim > ' ');
    return 0;
}
Reply
#6

Oh also I kept that in as I got errors without it, but I did not have the sscanf included for some reason, however it is still not functional
Reply
#7

Quote:
Originally Posted by ******
Посмотреть сообщение
Yes! Use the plugin!
I added the plugin and removed the stock, however I got a load of errors in the server log, so i added both into the server however it still did not work :S
Reply
#8

you are fucking the sscanf up by adding both variants. the best thing you can do: remove the sscanf stock in all your scripts, and #include the plugin. all upcoming errors/warnings are worth being converted to the new syntax, like changing a string "s" to a string with a destination size: "s[30]", or change an optional parameter to have a value: "D(1)".
it also could help us to see how your enum got declared. the order is relevant afaik?
adding debug lines in the house-reading loop will give you all information you need for further debugging, like
Код:
	new debugstring[128];
	format(debugstring, sizeof(debugstring), "House ID: %i Own:%s Pri:$%i Lev:%i",HouseInfo[idx][houseid], HouseInfo[idx][howner],HouseInfo[idx][hprice],HouseInfo[idx][hlevel]);
	SendClientMessageToAll(0xffaaaa00,debugstring);
..so you can see each single loaded house[looped idx]'s data
Reply
#9

Quote:
Originally Posted by Babul
Посмотреть сообщение
you are fucking the sscanf up by adding both variants. the best thing you can do: remove the sscanf stock in all your scripts, and #include the plugin. all upcoming errors/warnings are worth being converted to the new syntax, like changing a string "s" to a string with a destination size: "s[30]", or change an optional parameter to have a value: "D(1)".
it also could help us to see how your enum got declared. the order is relevant afaik?
adding debug lines in the house-reading loop will give you all information you need for further debugging, like
Код:
	new debugstring[128];
	format(debugstring, sizeof(debugstring), "House ID: %i Own:%s Pri:$%i Lev:%i",HouseInfo[idx][houseid], HouseInfo[idx][howner],HouseInfo[idx][hprice],HouseInfo[idx][hlevel]);
	SendClientMessageToAll(0xffaaaa00,debugstring);
..so you can see each single loaded house[looped idx]'s data
You're a bit late now, I have given up on that gamemode and I am making a new one which fully uses mysql and I am going to copy some of my commands etc. across.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)