Sistema de Freno й Mano.
#1

Buenas, he modificado un sistema de freno para que funcione al usar el comando y cargar vehнculo, pero ahora no funciona para nada, se supone que al poner /freno el vehнculo tiene que quedar inmуvil ante movimiento de un usuario, alguien se echa un vistazo por el sistema a ver si encuentra una falla?

PD; el cуdigo sale desorganizado, mбs no es asн, es cosa del foro.

Код:
new Float:VehFrenoPOS[MAX_VEHICLES][4];
new Float:VehComprobar[MAX_VEHICLES][4];
enum DataCar
{
	cFreno
};
new CarInfo[MAX_VEHICLES][DataCar];

public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat)
{
	new Auto = GetVehicleFromId(vehicleid);
    if(CarInfo[CarInfo[Auto][cId]][cFreno] == 1)
    {
        GetVehiclePos(playerid, VehComprobar[CarInfo[Auto][cId]][0], VehComprobar[CarInfo[Auto][cId]][1], VehComprobar[CarInfo[Auto][cId]][2]);
        GetVehicleZAngle(playerid, VehComprobar[playerid][3]);
        if(VehComprobar[CarInfo[Auto][cId]][0] == VehFrenoPOS[vehicleid][0] || VehComprobar[CarInfo[Auto][cId]][1] == VehFrenoPOS[CarInfo[Auto][cId]][1] || VehComprobar[CarInfo[Auto][cId]][2] == VehFrenoPOS[CarInfo[Auto][cId]][2]|| VehComprobar[CarInfo[Auto][cId]][3] == VehFrenoPOS[CarInfo[Auto][cId]][3]) return 1;
        SetVehiclePos(CarInfo[Auto][cId], VehFrenoPOS[CarInfo[Auto][cId]][0], VehFrenoPOS[CarInfo[Auto][cId]][1], VehFrenoPOS[CarInfo[Auto][cId]][2]);
        SetVehicleZAngle(CarInfo[Auto][cId], VehComprobar[playerid][3]);
    }
	return 1;
}

>>>>>>> EN EL CARGADO; CarInfo[car][cFreno] = cache_get_field_content_int(car, "Freno");
			if(CarInfo[car][cFreno] == 1)
			{
                VehFrenoPOS[car][0] = CarInfo[car][cLocationx];
                VehFrenoPOS[car][1] = CarInfo[car][cLocationy];
                VehFrenoPOS[car][2] = CarInfo[car][cLocationz];
                VehFrenoPOS[car][3] = CarInfo[car][cAngle];
	            SetVehicleVelocity(car, 0, 0, 0);
            }
//
COMMAND:freno(playerid)
{
	static string[70];
	if (IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
	{
		new Auto = GetPlayerVehicle(playerid);
		if (!PlayerHaveKeys(playerid, Auto) && !IsACop(playerid)) return SendInfoMessage(playerid, 0, "No tienes las llaves del vehнculo para usar este comando.");
		if (CarInfo[Auto][cFreno] == 0)
		{
			CarInfo[Auto][cFreno] = 1;
            GetVehiclePos(Auto, VehFrenoPOS[Auto][0], VehFrenoPOS[Auto][1], VehFrenoPOS[Auto][2]);
            GetVehicleZAngle(Auto, VehFrenoPOS[Auto][3]);
            SetVehicleVelocity(Auto, 0, 0, 0);
			format(string, sizeof(string), "* %s activa el freno del mano del vehнculo.", pName(playerid));
		}
		else
		{
			CarInfo[Auto][cFreno] = 0;
			format(string, sizeof(string), "* %s desactiva el freno del mano del vehнculo.", pName(playerid));
		}
		ProxDetector(10.0, playerid, string, COL_MORADO, COL_MORADO, COL_MORADO, COL_MORADO, COL_MORADO);
		SaveCar(Auto);
	}
	else SendInfoMessage(playerid, 0, "Necesitas estar en un vehнculo y ser el conductor para usar este comando.");
	return 1;
}

//
stock GetVehicleFromId(id)
{
	for(new c = 0; c < TotalVeh; c++)
	{
		if(id == CarInfo[c][cId]) return c;
	}
	return -1;
}
stock GetPlayerVehicle(playerid)
{
	new car = GetPlayerVehicleID(playerid);
    if (car == 0) return -1;
	for (new i = 0; i < TotalVeh; i++)
 		if (car == CarInfo[i][cId])
			return i;
	return -1;
}
Reply
#2


ehmmmm, normalmente, deberнas hacerlo constante, que se frene Constantemente, asн no lo usarнan, tipo en OnPlayerUpdate o un timer.

"* %s activa el freno del mano del vehнculo."

Reply
#3

Ya lo he hecho haciйndolo diferente y gracias por hacerme notar el error Parka, tanto de cуdigo como ortogrбfico.
Reply
#4

No he revisado todo el cуdigo, solo quiero comentar una incongruencia. Ten en cuenta que al utilizar GetVehiclePos en OnUnoccupiedVehicleUpdate se obtendrбn las coordenadas previas a la actualizaciуn, es decir:
PHP код:
/* Si tu tienes almacenado en unas variables datos del tipo: */
posX[vehicleid] = 1.0;
posY[vehicleid] = 2.0;
posZ[vehicleid] = 3.0;
/* Suponiendo que alguien choca contra dicho vehнculo,
GetVehiclePos devuelve los valores iniciales en OnUnoccupiedVehicleUpdate, veamos: */
new Float:veh_pos[3];
GetVehiclePos(vehicleidveh_pos[0], veh_pos[1], veh_pos[2]);
/* Entonces: */
veh_pos[0] = posX[vehicleid] = 1.0;
/* ... */ 
Para evitar este fenуmeno lo correcto serнa comparar los datos de los parбmetros correspondientes a la funciуn OnUnoccupiedVehicleUpdate, actualizada en la 0.3z.
Reply
#5

Gracias a ambos por esa data, nunca habнa usado dicho Call, asн ha quedado,

Код:
public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat, Float:new_x, Float:new_y, Float:new_z, Float:vel_x, Float:vel_y, Float:vel_z)
{
	new Auto = GetVehicleFromId(vehicleid);
    if(FrenoDeMano[vehicleid] == 1)
    {
            //GetVehiclePos(playerid, VehComprobar[vehicleid][0], VehComprobar[vehicleid][1], VehComprobar[vehicleid][2]);
            GetVehicleZAngle(playerid, VehComprobar[playerid][3]);
            if(new_x == VehFrenoPOS[vehicleid][0] || new_y == VehFrenoPOS[vehicleid][1] || new_z == VehFrenoPOS[vehicleid][2]|| VehComprobar[vehicleid][3] == VehFrenoPOS[vehicleid][3]) return 1;
            SetVehiclePos(vehicleid, VehFrenoPOS[vehicleid][0], VehFrenoPOS[vehicleid][1], VehFrenoPOS[vehicleid][2]);
            SetVehicleZAngle(vehicleid, VehComprobar[playerid][3]);
    }
    return 1;
}
El Call no detecta el Angle, por ende lo dejй asн.
Reply
#6

Creo que retornando 0 en la callback hace que no se mueva el vehнculo.
Reply
#7

Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)