Guardar posiciones de coches comprados
#1

Код:
public OnPlayerExitVehicle(playerid, vehicleid)
{
	if(GetPlayerVehicleID(playerid) > 3)
	{
    GetVehiclePos(vehicleid,Float:vx,Float:vy,Float:vz);
	GetVehicleZAngle(vehicleid,Float:va);
	for(new i = 0; i < sizeof(Vehicle); i++)
    {
        Vehicle[i][Positionx] = vx;
        Vehicle[i][Positiony] = vy;
        Vehicle[i][Positionz] = vz;
        SaveThings();
    }
    }
	return 1;
}
Cuando alguien usa un vehiculo y sale de йl, me gustarнa que se guarden las posiciones, para que no aparezca de vuelta en el concesionario. Pero hay un bug y TODOS los coches del concesionario aparecen ahн, їcуmo se soluciona?
Reply
#2

No es tan sencillo, debes de decir que sistema de guardado usas (sql, ini, etc)
Te recomiendo que mires unos cuantos tutoriales de guardado y cargado de datos

Hay muchos mбs, aquн te dejo unos cuantos:
https://sampforum.blast.hk/showthread.php?tid=262417
https://sampforum.blast.hk/showthread.php?tid=570912
https://sampforum.blast.hk/showthread.php?tid=129183

Si nunca has manejado alguno te recomendarнa empezar por sqlite o y_ini.
Reply
#3

Por bloc de notas, el bбsico que habнa en el GM The Godfather

Asн estб el cуdigo en pawno

Код:
enum VehicleInfo
{
	Model,
	Numberplate[MAX_PLAYER_NAME],
	Float:Positionx,
	Float:Positiony,
	Float:Positionz,
	Float:Angle,
	Interior,
	Virtual,
	Owner[MAX_PLAYER_NAME],
	Description[MAX_PLAYER_NAME],
	Owned,
	Time,
	Locked,
	Colorone,
	Colortwo
};
new Vehicle[11][VehicleInfo];

public LoadVehicles()
{
	new arrCoords[15][64];
	new strFromFile2[256];
	new File: file = fopen("vehicles/vehicles.cfg", io_read);
	if (file)
	{
		new idx;
		while (idx < sizeof(Vehicle))
		{
			fread(file, strFromFile2);
			split(strFromFile2, arrCoords, ',');
			Vehicle[idx][Model] = strval(arrCoords[0]);
			strmid(Vehicle[idx][Numberplate], arrCoords[1], 0, strlen(arrCoords[1]), 255);
			Vehicle[idx][Positionx] = floatstr(arrCoords[2]);
			Vehicle[idx][Positiony] = floatstr(arrCoords[3]);
			Vehicle[idx][Positionz] = floatstr(arrCoords[4]);
			Vehicle[idx][Angle] = floatstr(arrCoords[5]);
			Vehicle[idx][Interior] = strval(arrCoords[6]);
			Vehicle[idx][Virtual] = strval(arrCoords[7]);
			strmid(Vehicle[idx][Owner], arrCoords[8], 0, strlen(arrCoords[8]), 255);
			strmid(Vehicle[idx][Description], arrCoords[9], 0, strlen(arrCoords[9]), 255);
			Vehicle[idx][Owned] = strval(arrCoords[10]);
			Vehicle[idx][Time] = strval(arrCoords[11]);
			Vehicle[idx][Locked] = strval(arrCoords[12]);
			Vehicle[idx][Colorone] = strval(arrCoords[13]);
			Vehicle[idx][Colortwo] = strval(arrCoords[14]);

			idx++;
		}
		fclose(file);
	}
	return 1;
}
Es mбs largo pero pongo esto para que sepas cуmo es, ayъdame por favor.
Reply
#4

Creo que debes colocar SaveThings(i);

Si no funciona muestra el callback de SaveThings
Reply
#5

Me da un warning al poner la "i".

Код:
warning 202: number of arguments does not match definition
Aquн paso el cуdigo de SaveThings:

Код:
public SaveThings()
{
    new idx;
    new File: file2;
    while (idx < sizeof(House))
    {
        new coordsstring[256];
        format(coordsstring, sizeof(coordsstring), "%f,%f,%f,%f,%f,%f,%d,%s,%s,%d,%d,%d,%d,%d,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
        House[idx][Entradax],
        House[idx][Entraday],
        House[idx][Entradaz],
        House[idx][Exitx],
        House[idx][Exity],
        House[idx][Exitz],
        House[idx][Interior],
        House[idx][Owner],
        House[idx][Descripcion],
        House[idx][Comprada],
		House[idx][Precio],
		House[idx][Alquiler],
		House[idx][Time],
		House[idx][Cerradura],
		House[idx][Armariox],
		House[idx][Armarioy],
		House[idx][Armarioz],
		House[idx][Hueco1],
		House[idx][Cantidad1],
		House[idx][Hueco2],
		House[idx][Cantidad2],
		House[idx][Hueco3],
		House[idx][Cantidad3],
		House[idx][Hueco4],
		House[idx][Cantidad4],
		House[idx][Hueco5],
        House[idx][Cantidad5]);

        if(idx == 0)
        {
            file2 = fopen("houses/houses.cfg", io_write);
        }
        else
        {
            file2 = fopen("houses/houses.cfg", io_append);
        }
        fwrite(file2, coordsstring);
        idx++;
        fclose(file2);
    }
    idx = 0;
    while (idx < sizeof(Vehicle))
    {
        new coordsstring[256];
        format(coordsstring, sizeof(coordsstring), "%d,%s,%f,%f,%f,%f,%d,%d,%s,%s,%d,%d,%d,%d,%d\n",
        Vehicle[idx][Model],
        Vehicle[idx][Numberplate],
        Vehicle[idx][Positionx],
        Vehicle[idx][Positiony],
        Vehicle[idx][Positionz],
        Vehicle[idx][Angle],
        Vehicle[idx][Interior],
        Vehicle[idx][Virtual],
        Vehicle[idx][Owner],
        Vehicle[idx][Description],
        Vehicle[idx][Owned],
        Vehicle[idx][Time],
        Vehicle[idx][Locked],
        Vehicle[idx][Colorone],
		Vehicle[idx][Colortwo]);

        if(idx == 0)
        {
            file2 = fopen("vehicles/vehicles.cfg", io_write);
        }
        else
        {
            file2 = fopen("vehicles/vehicles.cfg", io_append);
        }
        fwrite(file2, coordsstring);
        idx++;
        fclose(file2);
    }
    return 1;
}
Lo de House, ignуralo.
Reply
#6

Soy el que comento me habнa equivocado de cuenta, intenta esto quita el new idx; y pones public SaveThings(idx) igual en el forward a ver si eso te soluciona
Reply
#7

No es nada difнcil.

1) Creбs un define en el que establezcas el lнmite de vehнculos (MAX_VEHICLES).
2) Creбs un enum que contenga todas las variables que quieras para el vehнculo (variables flotantes que guarden las 3 coordenadas de posiciуn + el бngulo + la "vida", el ID del vehнculo en la base de datos, el dueсo del vehнculo, etc).
3) Creбs una funciуn para cargar los vehнculos en OnGameModeInit (el cargado va a ir por gustos, yo siempre recomiendo usar sqlite o mysql).
4) Creбs una funciуn para guardar los vehнculos a la base de datos, y la ejecutбs en varias ocasiones donde creas conveniente, como por ejemplo, mediante un timer que se ejecuta cada 1 hora + en OnGameModeExit + mediante un comando admin para editar los valores de un vehнculo (y en ese caso serнa conveniente sуlo guardar las variables que se cambiaron y no todas, etc).
5) Creбs una funciуn para crear los vehнculos, la cuбl vas a ejecutar segъn los mйtodos de obtenciуn de vehнculos que tengas en tu GM. Dentro de esta funciуn, se deberнan insertar todos los datos del vehнculo al tipo de guardado que tengas. Es importante que cada vez que se cree un vehнculo, la variable que almacene el ID de йste incremente a 1.

Con respecto a guardar la posiciуn, en el mismo guardado que comento en el punto 4, deberнa comprobar la posiciуn del vehнculo (GetVehiclePos) y luego sн, almacenarla a la base de datos. Y en el cargado se fija la ъltima posiciуn del vehнculo y listo.

Estuve probando a versiуn r39 de mysql (la r39-4, porque la r39-5 requiere actualizar las librerнas de Visual C++ y sinceramente no tengo ganas) y la verdad que tiene buen funcionamiento. Es una buena idea crear un guardado de datos con esto en caso de que en un futuro se quiera enlazar el servidor SAMP con servidores externos como pбginas web (foros, pcu), teamspeak, etc. Pero si no se busca eso, un guardado de datos nativo como lo es el sqlite, puede andar bien.

Si no se sabe hacer algo como йsto no tiene sentido tener un servidor, hay que tener un mнnimo de conocimiento.

Si te gusta mysql r39:

https://github.com/pBlueG/SA-MP-MySQL/releases
https://sampwiki.blast.hk/wiki/MySQL/R33
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)