Vehicle password saving
#1

Yes, i'm scripting a thing that you as vehicle owner can set a password to your vehicle and else players that know the password are able to drive it (and i my server earn alittle more when making missions with owned vehicles).

The problems goes there when i set pass to a vehicle > exit server > restart server > join the server > password reset to nothing ("").
I loads the password if i : set the pass to a vehicle > exit server > join server (no restart between).

I post here the save/load codes (as the commands work):

pawn Код:
//To load the pass and putting it into a variable
            if (strcmp(ParameterName, "Pass", false) == 0) // If the parametername is correct ("Pass")
        AVehicleData[vid][Pass] = strval(ParameterValue);
           
            //To save the pass from the variable
       format(LineForFile, 100, "Pass %s\r\n", AVehicleData[vid][Pass]); // Construct the line: "Pass <Pass>"
       fwrite(HFile, LineForFile); // And save it to the file
It should be apretty simple piece of coding. These lines (load and save) is in an file with other stuff about the owned vehicles susch as: color, fuel, model etc etc...

Just tell me if i should post more things.
I think it is missing something so just reply as this obviously is not working.
Reply
#2

It is clearly not loading (at all or not correctly) the password for those vehicles when a server (re)starts.

Moreover you assign the password as integer to the variable but using "%s" specifier which is for strings (writing incorrectly to the file).

PS: I would suggest to you not to use file functions for it but a SQL or INI system instead.
Reply
#3

Okay, thanks! I thought about the integer and string thing but forgott when it didnt work. Thanks! I gotta see if it works. Yep i know ini would be better but when everything in this ppc trucking is coded using samps file functions...
Reply
#4

Well it sort of helped. It doesnt still work like it should. Been rewriting it pretty much now and now i have the problem that when player joins (owner of vehicle(s)), the password "jumps forward". Let me explain: You own 2 vehicles : sadler and burrito, you set sadler password to sadler and burrito password to burrito. Then you quit game (housefile shows right password for the right vehicle at this stage) then you join and then you find that the sadlers password is now burrito and burrito has no password at all (sadler was first bought and therefore first in the housefile list). Then you rejoin again and then sadler has no password and burrito has password of : No.
I dont have a clue how to get this work, been over a weeck of scripting daily, but no success.
Heres the code that saves and loads the vehicles (owned vehicles).
pawn Код:
// This function will load the house's datafile (used when the server is started to load all houses)
HouseFile_Load(HouseID, bool:OnlyLoadVehicles = false)
{
    new file[100], File:HFile, LineFromFile[100], ParameterName[50], ParameterValue[50];
    // Setup local variables
    new cModel, cPaint, components[14], Float:cx, Float:cy, Float:cz, Float:crot, Col1, Col2, vid, bool:VehicleClamped, cFuel = -1;

    format(file, sizeof(file), HouseFile, HouseID); // Construct the complete filename for this house-file

    if (fexist(file))
    {
        HFile = fopen(file, io_read); // Open the housefile for reading

        fread(HFile, LineFromFile); // Read the first line of the file

        // Set the house so it cannot be entered by anyone, except the owner (close the house)
        AHouseData[HouseID][HouseOpened] = false;

        // Keep reading until the end of the file is found (no more data)
        while (strlen(LineFromFile) > 0)
        {
            StripNewLine(LineFromFile); // Strip any newline characters from the LineFromFile
            sscanf(LineFromFile, "s[50]s[50]", ParameterName, ParameterValue); // Extract parametername and parametervalue

            // If OnlyLoadVehicles is "false", only load the house-data
            // If OnlyLoadVehicles is "true", only load the vehicle-data
            if (OnlyLoadVehicles == false)
            {
                // Store the proper value in the proper place
                if (strcmp(ParameterName, "HouseAddress", false) == 0) // If the parametername is correct ("HouseAddress")
                    format(AHouseData[HouseID][HouseAddress], 24, ParameterValue); // Store the HouseAddress
                if (strcmp(ParameterName, "HouseName", false) == 0) // If the parametername is correct ("HouseName")
                    format(AHouseData[HouseID][HouseName], 24, ParameterValue); // Store the HouseName
                if (strcmp(ParameterName, "HouseX", false) == 0) // If the parametername is correct ("HouseX")
                    AHouseData[HouseID][HouseX] = floatstr(ParameterValue); // Store the HouseX
                if (strcmp(ParameterName, "HouseY", false) == 0) // If the parametername is correct ("HouseY")
                    AHouseData[HouseID][HouseY] = floatstr(ParameterValue); // Store the HouseY
                if (strcmp(ParameterName, "HouseZ", false) == 0) // If the parametername is correct ("HouseZ")
                    AHouseData[HouseID][HouseZ] = floatstr(ParameterValue); // Store the HouseZ
                if (strcmp(ParameterName, "HouseLevel", false) == 0) // If the parametername is correct ("HouseLevel")
                    AHouseData[HouseID][HouseLevel] = strval(ParameterValue); // Store the HouseLevel
                if (strcmp(ParameterName, "HouseMaxLevel", false) == 0) // If the parametername is correct ("HouseMaxLevel")
                    AHouseData[HouseID][HouseMaxLevel] = strval(ParameterValue); // Store the HouseMaxLevel
                if (strcmp(ParameterName, "HousePrice", false) == 0) // If the parametername is correct ("HousePrice")
                    AHouseData[HouseID][HousePrice] = strval(ParameterValue); // Store the HousePrice
                if (strcmp(ParameterName, "Owned", false) == 0) // If the parametername is correct ("Owned")
                {
                    if (strcmp(ParameterValue, "Yes", false) == 0) // If the value "Yes" was read
                        AHouseData[HouseID][Owned] = true; // House is owned
                    else
                        AHouseData[HouseID][Owned] = false; // House is not owned
                }
                if (strcmp(ParameterName, "Owner", false) == 0) // If the parametername is correct ("Owner")
                    // Store the Owner (Owner will hold "1" if there is no owner (empty string), done by "sscanf" I guess)
                    // But this doesn't matter, as the owner will never be displayed when the house is not owned by someone
                    format(AHouseData[HouseID][Owner], 24, ParameterValue);
                if (strcmp(ParameterName, "Insurance", false) == 0) // If the parametername is correct ("Insurance")
                    AHouseData[HouseID][Insurance] = strval(ParameterValue); // Store the Insurance
            }
            else // OnlyLoadVehicles is "true", so only read the vehicle-data
            {
                if (strcmp(ParameterName, "[Vehicle]", false) == 0) // If the parametername is correct ("[Vehicle]")
                {
                    // Clear all data to start a new vehicle
                    cModel = 0;
                    cPaint = 0;
                    cFuel = -1;
                    for (new i; i < 14; i++)
                        components[i] = 0;
                }
                if (strcmp(ParameterName, "Pass", false) == 0) // If the parametername is correct ("VehicleModel")
                    format(AVehicleData[vid][Pass], 24, ParameterValue); // Store the password
                if (strcmp(ParameterName, "VehicleModel", false) == 0) // If the parametername is correct ("VehicleModel")
                    cModel = strval(ParameterValue); // Store the VehicleModel
                if (strcmp(ParameterName, "Fuel", false) == 0) // If the parametername is correct ("Fuel")
                    cFuel = strval(ParameterValue); // Store the Fuel
                if (strcmp(ParameterName, "VehiclePaintJob", false) == 0) // If the parametername is correct ("VehiclePaintJob")
                    cPaint = strval(ParameterValue); // Store the VehiclePaintJob
                if (strcmp(ParameterName, "VehicleSpoiler", false) == 0) // If the parametername is correct ("VehicleSpoiler")
                    components[0] = strval(ParameterValue); // Store the VehicleSpoiler
                if (strcmp(ParameterName, "VehicleHood", false) == 0) // If the parametername is correct ("VehicleHood")
                    components[1] = strval(ParameterValue); // Store the VehicleHood
                if (strcmp(ParameterName, "VehicleRoof", false) == 0) // If the parametername is correct ("VehicleRoof")
                    components[2] = strval(ParameterValue); // Store the VehicleRoof
                if (strcmp(ParameterName, "VehicleSideSkirt", false) == 0) // If the parametername is correct ("VehicleSideSkirt")
                    components[3] = strval(ParameterValue); // Store the VehicleSideSkirt
                if (strcmp(ParameterName, "VehicleLamps", false) == 0) // If the parametername is correct ("VehicleLamps")
                    components[4] = strval(ParameterValue); // Store the VehicleLamps
                if (strcmp(ParameterName, "VehicleNitro", false) == 0) // If the parametername is correct ("VehicleNitro")
                    components[5] = strval(ParameterValue); // Store the VehicleNitro
                if (strcmp(ParameterName, "VehicleExhaust", false) == 0) // If the parametername is correct ("VehicleExhaust")
                    components[6] = strval(ParameterValue); // Store the VehicleExhaust
                if (strcmp(ParameterName, "VehicleWheels", false) == 0) // If the parametername is correct ("VehicleWheels")
                    components[7] = strval(ParameterValue); // Store the VehicleWheels
                if (strcmp(ParameterName, "VehicleStereo", false) == 0) // If the parametername is correct ("VehicleStereo")
                    components[8] = strval(ParameterValue); // Store the VehicleStereo
                if (strcmp(ParameterName, "VehicleHydraulics", false) == 0) // If the parametername is correct ("VehicleHydraulics")
                    components[9] = strval(ParameterValue); // Store the VehicleHydraulics
                if (strcmp(ParameterName, "VehicleFrontBumper", false) == 0) // If the parametername is correct ("VehicleFrontBumper")
                    components[10] = strval(ParameterValue); // Store the VehicleFrontBumper
                if (strcmp(ParameterName, "VehicleRearBumper", false) == 0) // If the parametername is correct ("VehicleRearBumper")
                    components[11] = strval(ParameterValue); // Store the VehicleRearBumper
                if (strcmp(ParameterName, "VehicleVentRight", false) == 0) // If the parametername is correct ("VehicleVentRight")
                    components[12] = strval(ParameterValue); // Store the VehicleVentRight
                if (strcmp(ParameterName, "VehicleVentLeft", false) == 0) // If the parametername is correct ("VehicleVentLeft")
                    components[13] = strval(ParameterValue); // Store the VehicleVentLeft

                if (strcmp(ParameterName, "Color1", false) == 0) // If the parametername is correct ("Color1")
                    Col1 = strval(ParameterValue); // Store the Color1
                if (strcmp(ParameterName, "Color2", false) == 0) // If the parametername is correct ("Color2")
                    Col2 = strval(ParameterValue); // Store the Color2

                if (strcmp(ParameterName, "VehicleX", false) == 0) // If the parametername is correct ("VehicleX")
                    cx = floatstr(ParameterValue); // Store the VehicleX
                if (strcmp(ParameterName, "VehicleY", false) == 0) // If the parametername is correct ("VehicleY")
                    cy = floatstr(ParameterValue); // Store the VehicleY
                if (strcmp(ParameterName, "VehicleZ", false) == 0) // If the parametername is correct ("VehicleZ")
                    cz = floatstr(ParameterValue); // Store the VehicleZ
                if (strcmp(ParameterName, "VehicleAngle", false) == 0) // If the parametername is correct ("VehicleAngle")
                    crot = floatstr(ParameterValue); // Store the VehicleAngle

                if (strcmp(ParameterName, "Clamped", false) == 0) // If the parametername is correct ("Clamped")
                {
                    if (strcmp(ParameterValue, "Yes", false) == 0) // If the value "Yes" was read
                        VehicleClamped = true; // Vehicle is clamped
                    else
                        VehicleClamped = false; // Vehicle is not clamped
                }

                if (strcmp(ParameterName, "[/Vehicle]", false) == 0) // If the parametername is correct ("[/Vehicle]")
                {
                    // Set both colors to 1 if they are 0 AND if there is a paintjob applied
                    if ((Col1 == 0) && (cPaint != 0))
                        Col1 = 1;
                    if ((Col2 == 0) && (cPaint != 0))
                        Col2 = 1;

                    // The "[/Vehicle]" is found, this means that all data about this vehicle is now stored in the variables
                    // Now add the vehicle to the house and set it's data
                    vid = House_AddVehicle(HouseID, cModel, cPaint, components, cx, cy, cz, crot, Col1, Col2);
                    AVehicleData[vid][Clamped] = VehicleClamped;
                    // Also set the fuel (set it to maximum when the fuel parameter wasn't inside the file)
                    if (cFuel == -1)
                    {
                        AVehicleData[vid][Fuel] = MaxFuel;
                    }
                    else // If the parameter was there, store it
                    {
                        AVehicleData[vid][Fuel] = cFuel;
                    }
                }
            }

            // Read the next line of the file
            fread(HFile, LineFromFile);
        }

        // Check if the maximum house-level isn't 0 (when updating to the new version)
        if (AHouseData[HouseID][HouseMaxLevel] == 0)
            AHouseData[HouseID][HouseMaxLevel] = 10; // Set the maximum level to 10

        // Close the file
        fclose(HFile);

        // Return if the file was read correctly
        return 1;
    }
    else
        return 0; // Return 0 if the file couldn't be read (doesn't exist)
}

// This function will save the given house
HouseFile_Save(HouseID)
{
    new file[100], File:HFile, LineForFile[100], vid;

    // Construct the complete filename for this house
    format(file, sizeof(file), HouseFile, HouseID);

    HFile = fopen(file, io_write); // Open the playerfile for writing

    format(LineForFile, 100, "HouseAddress %s\r\n", AHouseData[HouseID][HouseAddress]); // Construct the line: "HouseName <HouseName>"
    fwrite(HFile, LineForFile); // And save it to the file

    format(LineForFile, 100, "HouseName %s\r\n", AHouseData[HouseID][HouseName]); // Construct the line: "HouseName <HouseName>"
    fwrite(HFile, LineForFile); // And save it to the file

    format(LineForFile, 100, "HouseX %f\r\n", AHouseData[HouseID][HouseX]); // Construct the line: "HouseX <HouseX>"
    fwrite(HFile, LineForFile); // And save it to the file

    format(LineForFile, 100, "HouseY %f\r\n", AHouseData[HouseID][HouseY]); // Construct the line: "HouseY <HouseY>"
    fwrite(HFile, LineForFile); // And save it to the file

    format(LineForFile, 100, "HouseZ %f\r\n", AHouseData[HouseID][HouseZ]); // Construct the line: "HouseZ <HouseZ>"
    fwrite(HFile, LineForFile); // And save it to the file

    format(LineForFile, 100, "HouseLevel %i\r\n", AHouseData[HouseID][HouseLevel]); // Construct the line: "HouseLevel <HouseLevel>"
    fwrite(HFile, LineForFile); // And save it to the file

    format(LineForFile, 100, "HouseMaxLevel %i\r\n", AHouseData[HouseID][HouseMaxLevel]); // Construct the line: "HouseMaxLevel <HouseMaxLevel>"
    fwrite(HFile, LineForFile); // And save it to the file

    format(LineForFile, 100, "HousePrice %i\r\n", AHouseData[HouseID][HousePrice]); // Construct the line: "HousePrice <HousePrice>"
    fwrite(HFile, LineForFile); // And save it to the file

    if (AHouseData[HouseID][Owned] == true) // Check if the house is owned
    {
        format(LineForFile, 100, "Owned Yes\r\n"); // Construct the line: "Owned Yes"
        fwrite(HFile, LineForFile); // And save it to the file
    }
    else
    {
        format(LineForFile, 100, "Owned No\r\n"); // Construct the line: "Owned No"
        fwrite(HFile, LineForFile); // And save it to the file
    }

    format(LineForFile, 100, "Owner %s\r\n", AHouseData[HouseID][Owner]); // Construct the line: "Owner <Owner>"
    fwrite(HFile, LineForFile); // And save it to the file

    format(LineForFile, 100, "Insurance %i\r\n", AHouseData[HouseID][Insurance]); // Construct the line: "Insurance <Insurance>"
    fwrite(HFile, LineForFile); // And save it to the file



    // Save the vehicle-data for every vehicle added to the house
    for (new CarSlot; CarSlot < 10; CarSlot++)
    {
        // If a valid vehicle-id has been found
        if (AHouseData[HouseID][VehicleIDs][CarSlot] != 0)
        {
            // Get the vehicle id
            vid = AHouseData[HouseID][VehicleIDs][CarSlot];

            format(LineForFile, 100, "[Vehicle]\r\n"); // Construct the line: "[Vehicle]"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "Pass %s\r\n", AVehicleData[vid][Pass]); // Construct the line: "VehicleModel <VehicleModel>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleModel %i\r\n", AVehicleData[vid][Model]); // Construct the line: "VehicleModel <VehicleModel>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "Fuel %i\r\n", AVehicleData[vid][Fuel]); // Construct the line: "Fuel <Fuel>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehiclePaintJob %i\r\n", AVehicleData[vid][PaintJob]); // Construct the line: "VehiclePaintJob <VehiclePaintJob>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleSpoiler %i\r\n", AVehicleData[vid][Components][0]); // Construct the line: "VehicleSpoiler <VehicleSpoiler>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleHood %i\r\n", AVehicleData[vid][Components][1]); // Construct the line: "VehicleHood <VehicleHood>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleRoof %i\r\n", AVehicleData[vid][Components][2]); // Construct the line: "VehicleRoof <VehicleRoof>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleSideSkirt %i\r\n", AVehicleData[vid][Components][3]); // Construct the line: "VehicleSideSkirt <VehicleSideSkirt>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleLamps %i\r\n", AVehicleData[vid][Components][4]); // Construct the line: "VehicleLamps <VehicleLamps>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleNitro %i\r\n", AVehicleData[vid][Components][5]); // Construct the line: "VehicleNitro <VehicleNitro>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleExhaust %i\r\n", AVehicleData[vid][Components][6]); // Construct the line: "VehicleSpoiler <VehicleSpoiler>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleWheels %i\r\n", AVehicleData[vid][Components][7]); // Construct the line: "VehicleWheels <VehicleWheels>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleStereo %i\r\n", AVehicleData[vid][Components][8]); // Construct the line: "VehicleStereo <VehicleStereo>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleHydraulics %i\r\n", AVehicleData[vid][Components][9]); // Construct the line: "VehicleHydraulics <VehicleHydraulics>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleFrontBumper %i\r\n", AVehicleData[vid][Components][10]); // Construct the line: "VehicleFrontBumper <VehicleFrontBumper>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleRearBumper %i\r\n", AVehicleData[vid][Components][11]); // Construct the line: "VehicleRearBumper <VehicleRearBumper>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleVentRight %i\r\n", AVehicleData[vid][Components][12]); // Construct the line: "VehicleVentRight <VehicleVentRight>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleVentLeft %i\r\n", AVehicleData[vid][Components][13]); // Construct the line: "VehicleVentLeft <VehicleVentLeft>"
            fwrite(HFile, LineForFile); // And save it to the file

            format(LineForFile, 100, "Color1 %i\r\n", AVehicleData[vid][Color1]); // Construct the line: "Color1 <Color1>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "Color2 %i\r\n", AVehicleData[vid][Color2]); // Construct the line: "Color2 <Color2>"
            fwrite(HFile, LineForFile); // And save it to the file

            format(LineForFile, 100, "VehicleX %f\r\n", AVehicleData[vid][SpawnX]); // Construct the line: "VehicleVentLeft <VehicleVentLeft>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleY %f\r\n", AVehicleData[vid][SpawnY]); // Construct the line: "VehicleVentLeft <VehicleVentLeft>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleZ %f\r\n", AVehicleData[vid][SpawnZ]); // Construct the line: "VehicleVentLeft <VehicleVentLeft>"
            fwrite(HFile, LineForFile); // And save it to the file
            format(LineForFile, 100, "VehicleAngle %f\r\n", AVehicleData[vid][SpawnRot]); // Construct the line: "VehicleVentLeft <VehicleVentLeft>"
            fwrite(HFile, LineForFile); // And save it to the file

            if (AVehicleData[vid][Clamped] == true)
                format(LineForFile, 100, "Clamped Yes\r\n"); // Construct the line: "Clamped <Yes>"
            else
                format(LineForFile, 100, "Clamped No\r\n"); // Construct the line: "Clamped <No>"

            fwrite(HFile, LineForFile); // And save it to the file

            format(LineForFile, 100, "[/Vehicle]\r\n"); // Construct the line: "[/Vehicle]"
            fwrite(HFile, LineForFile); // And save it to the file
        }
    }

    fclose(HFile); // Close the file

    return 1;
}
Reply
#5

After the data have been stored to variables (local), it creates the vehicle and assign to "vid" a new value. After that, it sets the fuel for that new vehicle ID but you store the password to the "vid" which is a different value since the vehicle has not been created yet.

Store it to a temporary string and after creating the vehicle, copy that temporary string to VehicleData[vid][Pass].
Reply
#6

Thank you! + 1 rep for you
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)