Vehicle ID Issue (REP+)
#1

I've persevered from my previous issue but now there's a new one. One with ID's. Because I'm working with three different ID's here, it's sort of difficult to pinpoint which one I should be using where. I'm working with the ROW when I load from MySQL, the DB ID of the vehicle, and the VID in game.

This is my load function: Rows are starting at zero bear in mind.

PHP код:
forward InitiateVehicles();
public 
InitiateVehicles()
{
    new 
rows, fields, vehicles;
    
    
cache_get_data(rows, fields);
    for(new 
row; row < MAX_DYN_VEHICLES; row++)
    {
        
Vehicle[row][VehicleDatabaseID] = cache_get_field_content_int(row, "id", SQL);       
        
Vehicle[row][Model] = cache_get_field_content_int(row, "Model", SQL);
        
Vehicle[row][VehiclePos][0] = cache_get_field_content_float(row, "X", SQL);
        
Vehicle[row][VehiclePos][1] = cache_get_field_content_float(row, "Y", SQL);
        
Vehicle[row][VehiclePos][2] = cache_get_field_content_float(row, "Z", SQL);
        
Vehicle[row][VehiclePos][3] = cache_get_field_content_float(row, "A", SQL);
        
Vehicle[row][VehicleVW] = cache_get_field_content_int(row, "VW", SQL);
        
Vehicle[row][VehicleInt] = cache_get_field_content_int(row, "Int", SQL);
        
Vehicle[row][VehicleColour][0] = cache_get_field_content_int(row, "Colour1", SQL);
        
Vehicle[row][VehicleColour][1] = cache_get_field_content_int(row, "Colour2", SQL);
        
Vehicle[row][VehicleGroup] = cache_get_field_content_int(row, "Group", SQL);
        
Vehicle[row][Siren] = cache_get_field_content_int(row, "Siren", SQL);
        if(
Vehicle[row][VehiclePos][0] != 0.00000 && Vehicle[row][VehiclePos][1] != 0.00000 && Vehicle[row][VehiclePos][2] != 0.00000)
        {
            
Vehicle[row][VehID] = CreateVehicle(Vehicle[row][Model], Vehicle[row][VehiclePos][0], Vehicle[row][VehiclePos][1], Vehicle[row][VehiclePos][2], Vehicle[row][VehiclePos][3], Vehicle[row][VehicleColour][0], Vehicle[row][VehicleColour][1], -1, Vehicle[row][Siren]);
            
SetVehicleVirtualWorld(Vehicle[row][VehID], Vehicle[row][VehicleVW]);
            
LinkVehicleToInterior(Vehicle[row][VehID], Vehicle[row][VehicleInt]);
        }
        
printf("%d | %d | %d", row, Vehicle[row][VehicleDatabaseID], Vehicle[row][VehID]);
        
vehicles++;
    }
    switch(
vehicles)
    {
        case 
0: printf("[SCRIPT-LOAD/ERR] The script initiated 0 vehicles.", vehicles);
        default: 
printf("[SCRIPT-LOAD] The script has initiated %d vehicles", vehicles);
    }
} 
This successfully creates vehicles and the print that I put in looks like this for the two cars I have created: (I've laid it out in a table)

pawn Код:
ROW|DID|VID
[18:53:18] 0 | 1 | 1
Perfect, it does what it's suppose to do. But when I do /editvehicle 1 spawn (which is designed to move vehicle ID 1's spawn and save it's new location) it moves vehicle ID 2, and saves it's coordinates to DBID 2 in the database. The possible issues I'm having are probably with wrongly used ID's somewhere in the /editvehicle command.

Here you go: (I'll only show the 'spawn' option just to spare you a headache.)

PHP код:
CMD:editvehicle(playerid, params[])
{
    new 
id, usage[16], amount;
    if(
sscanf(params, "ds[16]D(0)", id, usage, amount)) 
    {
        if(
Player[playerid][AdminLevel] >= 5)
        {
            
SendClientMessage(playerid, WHITE, "USAGE: /editvehicle [id] [usage] [(optional) amount]");
            return 
SendClientMessage(playerid, GREY, "Usages: spawn, colour(1-2), group, delete");
        }
    }
    else if(
Player[playerid][AdminLevel] >= 5)
    {
        if(
id < 1 || id > MAX_VEHICLES) return SendClientMessage(playerid, WHITE, "That is not a valid vehicle ID!");
        if(
Vehicle[id][VehicleDatabaseID] < 1) return SendClientMessage(playerid, WHITE, "That is not a valid dynamic vehicle ID!");
        Array[
0] = 0;
        if(
strcmp(usage, "spawn", true) == 0)
        {
            new 
Float:Pos[4];
            
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
            
GetPlayerFacingAngle(playerid, Pos[3]);
            
Vehicle[id][VehiclePos][0] = Pos[0];
            
Vehicle[id][VehiclePos][1] = Pos[1];
            
Vehicle[id][VehiclePos][2] = Pos[2];
            
Vehicle[id][VehiclePos][3] = Pos[3];
            
Vehicle[id][VehicleVW] = GetPlayerVirtualWorld(playerid);
            
Vehicle[id][VehicleInt] = GetPlayerInterior(playerid);
            
format(Array, sizeof(Array), "You have moved the spawn of vehicle %d", id);
            
SendClientMessage(playerid, WHITE, Array);
            
format(Array, sizeof(Array), "[/EDITVEHICLE] %s has moved the spawn of vehicle %d to X: %f, Y: %f, Z: %f", GetName(playerid), id, Pos[0], Pos[1], Pos[2]);
        }
        else
        {
            
SendClientMessage(playerid, WHITE, "USAGE: /editvehicle [id] [usage] [(optional) amount]");
            return 
SendClientMessage(playerid, GREY, "Usages: spawn, colour(1-2), group, delete");
        }
        
Log(4, Array);
        
RespawnVehicle(id);
        
SaveVehicle(id);
    }
    else 
SendClientMessage(playerid, WHITE, "You are not authorized to preform this command.");
    return 
1;
} 
Any reason why the ID's are getting mismatched and confused?
Reply
#2

because rows starts from 0 not 1 so you need use [id - 1]
Reply
#3

Quote:
Originally Posted by Jefff
Посмотреть сообщение
because rows starts from 0 not 1 so you need use [id - 1]
Thank you! It works! But would I have to do this every time I want to mess with my dynamic vehicle system or could I just make it so the ID is 'corrected' when they initiate?

Edit: Also, say I have an admin spawned vehicle (different from a dynamic vehicle) that is occupying slot 1. I also have a dynamic vehicle occupying slot 2. If I delete the admin spawned vehicle, and then use the command /editvehicle, my dynamic vehicle will respawn to ID 1. I just tested this in game, but the script still thinks it has ID 2.

Here's my respawn function:

PHP код:
RespawnVehicle(id) 
{ 
    
DestroyVehicle(Vehicle[id][VehID]); 
    if(
Vehicle[id][VehiclePos][0] != 0.00000 && Vehicle[id][VehiclePos][1] != 0.00000 && Vehicle[id][VehiclePos][2] != 0.00000) 
    { 
        
Vehicle[id][VehID] = CreateVehicle(Vehicle[id][Model], Vehicle[id][VehiclePos][0], Vehicle[id][VehiclePos][1], Vehicle[id][VehiclePos][2], Vehicle[id][VehiclePos][3], Vehicle[id][VehicleColour][0], Vehicle[id][VehicleColour][1], -1, Vehicle[id][Siren]); 
        
SetVehicleVirtualWorld(Vehicle[id][VehID], Vehicle[id][VehicleVW]); 
        
LinkVehicleToInterior(Vehicle[id][VehID], Vehicle[id][VehicleInt]); 
    } 
    return 
1; 
} 
Reply
#4

Here must be too (id-1)
Reply
#5

Quote:
Originally Posted by Jefff
Посмотреть сообщение
Here must be too (id-1)
It is:

PHP код:
else if(Player[playerid][AdminLevel] >= 5)
    {
        if(
id < 1 || id > MAX_VEHICLES) return SendClientMessage(playerid, WHITE, "That is not a valid vehicle ID!");
        if(
Vehicle[id][VehID] > 1) return SendClientMessage(playerid, WHITE, "That is not a valid dynamic vehicle ID!");
        Array[
0] = 0;
        
id = id - 1; // Here we subtract the ID the player put into the command.
        
if(strcmp(usage, "spawn", true) == 0)
        {
            if(!
IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, WHITE, "You must be in a vehicle to edit the spawn!");
            new 
Float:Pos[4];
            
GetVehiclePos(GetPlayerVehicleID(playerid), Pos[0], Pos[1], Pos[2]);
            
GetVehicleZAngle(GetPlayerVehicleID(playerid), Pos[3]);
            
Vehicle[id][VehiclePos][0] = Pos[0];
            
Vehicle[id][VehiclePos][1] = Pos[1];
            
Vehicle[id][VehiclePos][2] = Pos[2];
            
Vehicle[id][VehiclePos][3] = Pos[3];
            
Vehicle[id][VehicleVW] = GetPlayerVirtualWorld(playerid);
            
Vehicle[id][VehicleInt] = GetPlayerInterior(playerid);
            
format(Array, sizeof(Array), "You have moved the spawn of vehicle %d", id + 1);
            
SendClientMessage(playerid, WHITE, Array);
            
format(Array, sizeof(Array), "[/EDITVEHICLE] %s has moved the spawn of vehicle %d to X: %f, Y: %f, Z: %f", GetName(playerid), id + 1, Pos[0], Pos[1], Pos[2]);
        }
        else
        {
            
SendClientMessage(playerid, WHITE, "USAGE: /editvehicle [id] [usage] [(optional) amount]");
            return 
SendClientMessage(playerid, GREY, "Usages: spawn, colour(1-2), group, delete");
        }
        
Log(4, Array);
        
RespawnVehicle(id); // Here we respawn that ID.
        
SaveVehicle(id); 
Reply
#6

but id is 0 ( slot 1 ) Vehicle[id][VehID] so i dont understand you
Reply
#7

Quote:
Originally Posted by Jefff
Посмотреть сообщение
but id is 0 ( slot 1 ) Vehicle[id][VehID] so i dont understand you
Say I have an NRG that is ID 1, it is not a dynamic vehicle. I have a sultan that is ID 2, it is a dynamic vehicle. I delete the NRG and respawn the sultan. The sultan is now ID 1, but the server still thinks it's ID 2. if I edit ID 1, it will update in the database but not respawn the car. If I edit ID 2, it won't update in the database but it will respawn the car.
Reply
#8

Show how you create this nrg and destroy
Reply
#9

Quote:
Originally Posted by Jefff
Посмотреть сообщение
Show how you create this nrg and destroy
PHP код:
CMD:spawnvehicle(playerid, params[]) 
{
    if(
Player[playerid][AdminLevel] >= 2) 
    {
        new 
vehicle, colour[2];
        if(
sscanf(params, "iD(0)D(0)", vehicle, colour[0], colour[1])) return SendClientMessage(playerid, WHITE, "SYNTAX: /spawnvehicle [model] [(optional) colour] [(optional) colour]");
        else if(!(
400 <= vehicle <= 611)) return SendClientMessage(playerid, WHITE, "You specified an invalid model ID. (IDs start at 400, and end at 611).");
        else if(!(
0 <= colour[0] <= 255 && 0 <= colour[1] <= 255)) return SendClientMessage(playerid, WHITE, "You specified an invalid colour ID. (IDs start at 0, and end at 255).");
        else for(new 
i; i < sizeof(AdminVehicles); i++) if(i >= MAX_ADMIN_VEHICLES) return SendClientMessage(playerid, WHITE, "The maximum limit of 50 spawned vehicles has been reached.");
        else if(
AdminVehicles[i] == INVALID_VEHICLE_ID) 
        {
            new 
Float:Pos[4];
            
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
            
GetPlayerFacingAngle(playerid, Pos[3]);
            
AdminVehicles[i] = CreateVehicle(vehicle, Pos[0], Pos[1], Pos[2], Pos[3], colour[0], colour[1], -1);
            
LinkVehicleToInterior(AdminVehicles[i], GetPlayerInterior(playerid));
            
SetVehicleVirtualWorld(AdminVehicles[i], GetPlayerVirtualWorld(playerid));
            return 
SendClientMessage(playerid, WHITE, "You have successfully created a vehicle.");
        }
    }
    else 
SendClientMessage(playerid, WHITE, "You are not authorized to use that command.");
    return 
1;
} 
PHP код:
CMD:destroyvehicles(playerid, params[])
{
    if(
Player[playerid][AdminLevel] >= 4) 
    {
        for(new 
i = 0; i < sizeof(AdminVehicles); i++) 
        {
            if(
AdminVehicles[i] != INVALID_VEHICLE_ID) 
            {
                
DestroyVehicle(AdminVehicles[i]);
                
AdminVehicles[i] = INVALID_VEHICLE_ID;
            }
        }
        
SendClientMessage(playerid, WHITE, "You have successfully destroyed all administrative spawned vehicles.");
    }
    else 
SendClientMessage(playerid, WHITE, "You are not authorized to preform this command.");
    return 
1;
} 
Reply
#10

All what you need to save is databaseID ( Vehicle[row][VehicleDatabaseID] DID ) not vehicleID ( Vehicle[id][VehID] VID )
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)